Python:当组标签和单个单元位于原始数据的同一列时,为组标签和单个单元创建单独的列

时间:2017-02-25 17:30:40

标签: python pandas indexing grouping multi-level

我是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
    ...

也就是说,在原始数据中,单位列在各自的组标签下,并且它们都列在同一列中,而每个组可能包含不同数量的单位。所以我很难使用间隔或其他方法切片数据。如何将原始数据排序或切片到我想要的双列数据帧类型输出中?

提前致谢。

1 个答案:

答案 0 :(得分: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