根据空行将Pandas Dataframe拆分为多个较小的数据帧

时间:2016-04-08 09:58:49

标签: python csv pandas

我有一个csv文件,其格式如下:

Header 1, Header 2, Header 3
''          ''        ''
value 1,  value2,   value 3
value 1,  value2,   value 3
value 1,  value2,   value 3
''          ''        ''
value 1,  value 2,   value 3
value 1,  value 2,   value 3
value 1,  value 2,   value 3
 ''          ''        ''

我可以将它读入一个pandas数据帧,但是由空行包围的段(由''表示)需要分别进行处理。什么是最简单的方法将它们分成较小的数据帧,基于它们在空行之间?我有很多这样的部分要经历。

将它们划分为更小的数据帧会更容易吗?或者在处理后更容易从原始数据帧中删除该段?

修改

IanS的答案是正确的,但在我的情况下,我的一些文件在空行中根本没有引号,因此类型不是字符串。我稍微修改了他的答案,这对他们有用:

df['counter'] = (df['Header 1'].isnull()).cumsum()
df = df[df['Header 1'].isnull() == False]  # remove empty rows
df.groupby('counter').apply(lambda df: df.iloc[0])

2 个答案:

答案 0 :(得分:3)

我认为你可以在str.contains找到空行,在cumsum创建计数器series,在groupby创建here is my screen shot. ,然后在循环中得到小DataFrames

print df['Header 1'].str.contains("''").cumsum()
0    1
1    1
2    1
3    1
4    2
5    2
6    2
7    2
8    3
Name: Header 1, dtype: int32

for idx, group in df.groupby(df['Header 1'].str.contains("''").cumsum()):
    print idx
    print group[1:]
1
  Header 1  Header 2    Header 3
1  value 1    value2     value 3
2  value 1    value2     value 3
3  value 1    value2     value 3
2
  Header 1   Header 2    Header 3
5  value 1    value 2     value 3
6  value 1    value 2     value 3
7  value 1    value 2     value 3
3
Empty DataFrame
Columns: [Header 1,  Header 2,  Header 3]
Index: []

如果需要,可以创建DataFrames字典:

dfs = {}
for idx, group in df.groupby(df['Header 1'].str.contains("''").cumsum()):
    dfs.update({idx:group[1:]})

答案 1 :(得分:1)

最简单的方法是添加一个计数器,每次遇到空行时都会递增。然后,您可以通过groupby获取各个数据框。

df['counter'] = (df['Header1'] == "''").cumsum()
df = df[df['Header1'] != "''"]  # remove empty rows
df.groupby('counter').apply(lambda df: df.iloc[0])

最后一行将处理函数分别应用于每个数据帧(我只是举了一个虚拟示例)。

请注意,空行(此处为df['Header1'] == "''")的确切条件测试应根据您的具体情况进行调整。