Python 基于空行将数据帧拆分为多个较小的数据帧
我有一个csv文件,格式如下:Python 基于空行将数据帧拆分为多个较小的数据帧,python,csv,pandas,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, val
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
'' '' ''
我可以将其读入一个数据帧,但是由表示为的空行包围的段需要单独处理。基于空行之间的数据帧,将它们划分为更小的数据帧的最简单方法是什么?我有相当多的这些部分要经历
将它们划分为更小的数据帧会更容易,还是在处理后从原始数据帧中删除该段会更容易
编辑:
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])
我认为您可以通过查找空行,创建计数器序列,然后在循环中获得小数据帧: 如果需要,可以创建数据帧字典:
最简单的方法是添加一个计数器,每次遇到空行时计数器都会递增。然后,您可以通过groupby获得您的单个数据帧 最后一行将处理函数分别应用于每个数据帧,我只是举了一个虚拟示例
请注意,此处对空行的确切条件测试df['Header1']==应根据您的具体情况进行调整。最简单的方法是添加一个计数器,每次遇到空行时计数器都会递增。然后,您可以通过df.groupby'counter'获得您的单个数据帧。如果你感兴趣的话,我可以写一个答案。这是个好主意,我会试着在我这边写,但如果你写你的,我会接受它作为答案
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: []
dfs = {}
for idx, group in df.groupby(df['Header 1'].str.contains("''").cumsum()):
dfs.update({idx:group[1:]})
df['counter'] = (df['Header1'] == "''").cumsum()
df = df[df['Header1'] != "''"] # remove empty rows
df.groupby('counter').apply(lambda df: df.iloc[0])