Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于空行将数据帧拆分为多个较小的数据帧_Python_Csv_Pandas - Fatal编程技术网

Python 基于空行将数据帧拆分为多个较小的数据帧

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

我有一个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
 ''          ''        ''
我可以将其读入一个数据帧,但是由表示为的空行包围的段需要单独处理。基于空行之间的数据帧,将它们划分为更小的数据帧的最简单方法是什么?我有相当多的这些部分要经历

将它们划分为更小的数据帧会更容易,还是在处理后从原始数据帧中删除该段会更容易

编辑:

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])