Python:为组标签和单个单元创建单独的列,当两者都在原始数据的同一列中时

Python:为组标签和单个单元创建单独的列,当两者都在原始数据的同一列中时

问题描述:

我是Python的新手,我怀疑这个问题可能以前曾被问过,但是我确实找不到任何相关的线程。因此,这个问题。Python:为组标签和单个单元创建单独的列,当两者都在原始数据的同一列中时

我打算创建包含“组标签”和“单独的单元”,但原始数据单独的列中的数据帧被构造是这样的:

import pandas as pd 
df = pd.read_table('df.txt', names = 'data') 

读取

 data 
0 group1 
1 unit_a 
2 unit_b 
3 group2 
4 unit_c 
5 unit_d 
6 unit_e 
7 group3 
8 unit_f 
9 unit_g 
... 

但我想创建这样

 Group Unit 
    0 group1 unit_a 
    1 group1 unit_b 
    2 group2 unit_c 
    3 group2 unit_d 
    4 group2 unit_e 
    5 group3 unit_f 
    6 group3 unit_g 
    ... 

也就是说,在原始数据的数据帧,U尼特在其各自的组标签下列出,并且它们全部列在同一列中,而每个组可以包含不同数量的单元。所以我很难用间隔或其他方法来分割数据。我怎样才能将原始数据排序或切片到我想要的两列数据帧类型输出中?

在此先感谢。

+0

这些是真正的字符串称为'group1'和'unit_a'或者您使用的占位符这里一些实际的数据? – miradulo

+0

感谢您的提醒!他们是字符串(组名,个人名字)。 –

一个非常基本的方法是仅使用str.contains指定一个带有屏蔽值的新列,过滤列匹配的行(例如group1, group1),然后重置索引。

df = (df.assign(group=df[df.data.str.contains('group')]) 
     .ffill() 
     .query('data != group') 
     .reset_index(drop=True) 
     .rename(columns={'data':'unit'})) 

我不禁感觉有一个更简单的方法去做这件事。

演示

>>>> (df.assign(group=df[df.data.str.contains('group')]) 
     .ffill() 
     .query('data != group') 
     .reset_index(drop=True)) 
     .rename(columns={'data':'unit'})) 

    unit group 
0 unit_a group1 
1 unit_b group1 
2 unit_c group2 
3 unit_d group2 
4 unit_e group2 
5 unit_f group3 
6 unit_g group3 
+0

感谢您的回复。 我将方括号添加到给出几个唯一组名称的原始数据框的子集。 mask = df [df ['data']。str.contains(“group”)] 但是对于以df [mask]开头的第二步,由于mask和df是不同长度的数据帧,工作。我将继续处理你提供的代码。 我在另一个论坛上看到建议使用部分字符串匹配,但目前超出了我。 更新:对不起,我没有看到您的更新代码。我会尝试实施。 –

+0

@ChrisT。这种方法应该工作。 – miradulo

+0

我被困在.query('data!= group') Python返回一条错误消息,与“数据”的定义有关,它丢失了。 .query('data!= group')中的“数据”是否等同于df ['a']或df的数据框? 谢谢。 –