环境- PY3.6,木星笔记本:
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像我希望的那样被多个索引化来工作。
我的具体问题是熊猫是否有功能做到这一点?
或
我是否需要使用组名称作为列标题将df分解为组件组-然后执行stack()或melt()类型函数?
编辑:我想我也可以迭代行-但这将是很棘手的,因为“组”并不总是已知的。
发布于 2018-04-03 04:06:54
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发布于 2018-04-03 03:38:04
有一种方法--不能保证速度和优雅:
# 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发布于 2018-04-03 03:41:56
你可以试试:
# convert list to df
xl = pd.DataFrame(xl)
# extract words starting with group and fill the following blank values
xl['1'] = xl[0].str.findall('group.*').str[0].ffill()
# set value as NA where group is present in column 0
xl['1'] = xl.groupby('1')['1'].shift(1)
print(xl)
0 1
0 group1 NaN
1 john group1
2 mike group1
3 marry group1
4 group2 NaN
5 dan group2
6 ann group2
7 jacob group2
8 susan group2https://stackoverflow.com/questions/49621727
复制相似问题