环境 - 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"并不总是知道。
答案 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}}