我有一个数据框架(来自一个格式奇怪的Excel文件),它在行中有数据的部分。像这样的例子:
我能够使用以下命令将不同的标题分组在一起。如果你愿意的话,它应该允许你添加更多的标题,但确实需要少量的技术债务来保持当前状态(除非有更多的你的表,我看不出你可以更多地工作)。这也假设在不同的组之间没有那条线。如果你这样做,那么我会根据需要简单地使用dropna()删除它们。
import pandas as pd
import numpy as np
header_list = ['First Group Header', 'Second Group Header', 'Third Group Header']
df['GROUPER'] = np.where(df['Name'].isin(header_list), df['Name'], np.nan)
df['GROUPER'] = df['GROUPER'].ffill()
我建议以下解决方案
import pandas as pd
df = pd.DataFrame({"Name":["1st header","A","B","2nd header","AA","BB","CC","DD","3rd header","AAA"],"col1":[1,2,3,10,20,30,40,50,100,200],"col2":[2,4,6,20,40,60,80,100,200,400]})
df["groupn"] = df["Name"].str.contains("header").cumsum()
group_dfs = [d for n, d in df.groupby("groupn")]
# group_dfs is now list of pd.DataFrames
for g_df in group_dfs:
print(g_df)
print("=====")
给输出
Name col1 col2 groupn
0 1st header 1 2 1
1 A 2 4 1
2 B 3 6 1
=====
Name col1 col2 groupn
3 2nd header 10 20 2
4 AA 20 40 2
5 BB 30 60 2
6 CC 40 80 2
7 DD 50 100 2
=====
Name col1 col2 groupn
8 3rd header 100 200 3
9 AAA 200 400 3
=====
解释:您需要具有将True
s用于标头和False
s用于非标头的功能,我检查Name
是否包含子字符串header
,但如果需要,可以进行其他检查,然后我使用给出组数的累积和,这是可能的,因为True
和False
被假定为1
和0
分别在python
中需要时,然后我group BY该列并创建子数据框列表。观察它们有groupn
列,如果不再需要,您可以选择删除它。