熊猫:将群组标题移动到新列

时间:2018-04-03 03:23:35

标签: python python-3.x pandas

环境 - PY3.6,Jupyter笔记本:

import pandas as pd
import os
from IPython.display import display, HTML

我有一个excel文件,我已经读入了数据框。我在这里以编程方式重新创建了数据:

xl = [['group1'],
     ['john'],
     ['mike'],
     ['marry'],
     ['group2'],
     ['dan'],
     ['ann'],
     ['jacob'],
     ['susan']]

创建pd.DataFrame(),然后display

s = pd.DataFrame(xl)
display(s)

    0
0   group1
1   john
2   mike
3   marry
4   group2
5   dan
6   ann
7   jacob
8   susan

所需的输出是:

    0       1
0           group1
1   group1  john
2   group1  mike
3   group1  marry
4           group2
5   group2  dan
6   group2  ann
7   group2  jacob
8   group2  susan

我已经尝试了.melt()的几种变体,但只有在" group1"或" group2"是一个列索引。我还尝试了各种形式的.pivot().stack().stack函数似乎是最有希望的,但它要求DataFrame进行多索引才能正常工作。

我的具体问题是大熊猫是否有实现这一目标的功能?

OR

我是否需要使用组名作为列标题将df分解为组件 - 然后执行stack()melt()类型的功能?

编辑:我想我也可以遍历行 - 但这会像'" group"并不总是知道。

3 个答案:

答案 0 :(得分:2)

IIUC str.contains + ffill

df['1']=df['0'][df['0'].str.contains('group')]
df['1'].ffill(inplace=True)
df
Out[11]: 
        0       1
0  group1  group1
1    john  group1
2    mike  group1
3   marry  group1
4  group2  group2
5     dan  group2
6     ann  group2
7   jacob  group2
8   susan  group2

答案 1 :(得分:0)

这是一种方式 - 无法保证速度或优雅:

# Rename column to match desired output
df.columns = [1]

# Build a series with index=group_number, value=group_name
num2name = df[df[1].str.startswith('group')].reset_index(drop=True)

# Add column that indicates the group membership of each row, starting at 0
df[0] = df[1].str.startswith('group').cumsum() - 1

# Convert group numbers (0 onward) to group names ('groupN' starting from 1)
df[0].replace(group_rows, inplace=True)

df.sort_index(axis=1)
df
        0       1
0  group1  group1
1  group1    john
2  group1    mike
3  group1   marry
4  group2  group2
5  group2     dan
6  group2     ann
7  group2   jacob
8  group2   susan

答案 2 :(得分:0)

您可以尝试:

{{1}}