【发布时间】:2019-09-18 09:42:50
【问题描述】:
我有一个 excel 文件,数据框有 20 行。几行之后又有列名行,我想根据列名行划分数据框。
这是一个例子:
x
0
1
2
3
4
x
23
34
5
6
预期输出是:
df1
x
0
1
2
3
4
df2
x
23
34
5
6
【问题讨论】:
标签: python python-3.x pandas numpy
我有一个 excel 文件,数据框有 20 行。几行之后又有列名行,我想根据列名行划分数据框。
这是一个例子:
x
0
1
2
3
4
x
23
34
5
6
预期输出是:
df1
x
0
1
2
3
4
df2
x
23
34
5
6
【问题讨论】:
标签: python python-3.x pandas numpy
考虑到您的列名是 col ,您可以首先将数据框分组为 cumsum 在 col 上,其中值等于 x 通过 df['col'].eq('x').cumsum() ,然后为每个组创建一个数据框,采用该组第二行的值和列作为该组的第一个值,使用df.iloc[] 并将它们保存在字典中:
d={f'df{i}':pd.DataFrame(g.iloc[1:].values,columns=g.iloc[0].values)
for i,g in df.groupby(df['col'].eq('x').cumsum())}
print(d['df1'])
x
0 0
1 1
2 2
3 3
4 4
print(d['df2'])
x
0 23
1 34
2 5
3 6
【讨论】:
使用df.index[df['x'] == 'x'] 查找列名再次出现的行索引。
然后,根据找到的索引将数据帧分成2份
df = pd.DataFrame(columns=['x'], data=[[0], [1], [2], [3], [4], ['x'], [23], [34], [5], [6]])
df1 = df.iloc[:df.index[df['x'] == 'x'].tolist()[0]]
df2 = df.iloc[df.index[df['x'] == 'x'].tolist()[0]+1:]
【讨论】:
你没有提到这是你的数据集的样本。那么你可以试试这个
import pandas as pd
df1 = []
df2 = []
df1 = pd.DataFrame({'df1': ['x', 0, 1, 2, 3, 4]})
df2 = pd.DataFrame({'df2': ['x', 23, 34, 5, 6]})
display(df1, df2)
【讨论】: