python - Pandas read_csv() - Flie 包含不同的数据

标签 python pandas dataframe

问题: 我正在尝试将 csv 读入包含不同列大小的数据的 pandas 数据帧。

示例和说明:

Code: 
df = pd.read_csv(input, error_bad_lines=False)

input:
ID, Time, Val
15, 18:00:01, 4
15, 18:00:02, 6
15, 18:00:03, 5
ID, Time, Val1, Val2
16 18:00:03, 1, 43
ID, Time, Val
15, 18:00:04, 8

并且这种模式在整个文件中持续存在。最初我正在考虑扔掉多余的列,因为 read_csv 选项会抛出错误并且不读取它们,我只是开始忽略它们。然而,我随后在数据框中得到了重复的 header ...为了解决这个问题,我尝试了 drop_duplicates()但发现只有pandas的V0.17才包含 keep=False选项。我最终开始说服自己尝试保留数据。这是我的问题。根据上面的数据集,我希望能够创建两个独特的数据框。您可以假设 ID 始终是唯一的,因此您可以为拥有的不同 ID 数量创建 N 个框架。每个 ID 不会有相同数量的 header 。一旦遇到不同的 ID,就会打印其标题。例如,如果我们点击另一个 ID 16,其标题将在数据之前打印。同样,如果我们点击另一个 ID 15,其标题将在其数据之前打印。

我想也许在开始使用数据帧之前预处理数据,因为这是一个选项。但由于我对 pandas 的功能还很陌生,我希望在我继续编写一些令人讨厌的预处理代码之前,这里的一些人会提出建议:)。我的另一个想法变成了一个问题 - 对于 error_bad_lines,有没有办法将这些行保存到另一个数据帧或其他东西?另外,我告诉 pandas 在 read_csv 中只查找 ID 为 X 的项目,然后对我的所有 ID 执行此操作?我要补充一点,ID 的数量是有限且已知的。

我当前的 pandas 版本是 0.14。

最佳答案

请注意,我更正了示例数据中我认为存在的拼写错误。

  • 我使用前瞻正则表达式分割您的数据。我寻找后跟 ID 的换行符。
  • 然后解析列表中的每个元素并连接。
<小时/>
from io import StringIO
import pandas as pd
import re

txt = """ID, Time, Val
15, 18:00:01, 4
15, 18:00:02, 6
15, 18:00:03, 5
ID, Time, Val1, Val2
16, 18:00:03, 1, 43
ID, Time, Val
15, 18:00:04, 8"""

def parse(s):
    return pd.read_csv(StringIO(s), skipinitialspace=True)

pd.concat([parse(s) for s in re.split('\n(?=ID)', txt)])

   ID      Time  Val  Val1  Val2
0  15  18:00:01  4.0   NaN   NaN
1  15  18:00:02  6.0   NaN   NaN
2  15  18:00:03  5.0   NaN   NaN
0  16  18:00:03  NaN   1.0  43.0
0  15  18:00:04  8.0   NaN   NaN
<小时/>

以上是使用 OP 提供的示例数据进行的。如果这是在 csv 文件中,解决方案将如下所示

from io import StringIO
import pandas as pd
import re

with open('myfile.csv') as f:
    txt = f.read()

def parse(s):
    return pd.read_csv(StringIO(s), skipinitialspace=True)

pd.concat([parse(s) for s in re.split('\n(?=ID)', txt)])

关于python - Pandas read_csv() - Flie 包含不同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346185/

相关文章:

python - 当列名包含空格时删除多列 pandas

python - 使用 apply 函数 pandas 更正日期

python - 如何遍历 DataFrame 行并从 cols 中的字典中获取值?

python - PIL - 在图像上绘制多行文本

python - 将默认的日期时间对象值赋予 pandas.to_datetime()

python - 如果任何行包含特定字符串,则选择列

r - 如何一次性向 data.frame 添加多列?

python - 包装对象的最佳 Python 方式是什么?

python - 插入sqlite python不会更改表

python - 如何将返回值(从上一个函数)读取到 pandas、python 中?获取错误消息