我有一个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])
答案 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'] == "''"
)的确切条件测试应根据您的具体情况进行调整。