首页 > 解决方案 > Pandas csv 阅读器创建 NaN 索引

问题描述

我有一个 CSV 文件,其内容如下:

A: 12, B: 14
A:  1, B:  4
A:  2, B:  1
A: 21, B: 41

我可以用正则表达式分隔列:

import pandas as pd

df = pd.read_csv("test.csv", sep = ":\s*|,\s*", names = ["dummy1", "A", "dummy2", "B"], engine = "python")
print(df)

输出

  dummy1   A dummy2   B
0      A  12      B  14
1      A   1      B   4
2      A   2      B   1
3      A  21      B  41

为了防止创建无用的列,我尝试了以下策略:

import pandas as pd

df1 = pd.read_csv("test.csv", sep = "A:\s*|,\s*B:\s*", names = ["A", "B"], engine = "python")
print(df1)

但现在索引只包含NaN值:

      A   B
NaN  12  14
NaN   1   4
NaN   2   1
NaN  21  41

为什么会发生这种情况以及如何预防?

标签: pythonpython-3.xpandascsv

解决方案


pandas.read_csv函数接受一个index_col参数,该参数指示 DataFrame 的行标签(索引)。您需要使用int索引或索引序列设置此参数,因为默认情况下它是无。

index_col: int or sequence or False, 默认无

用作 DataFrame 的行标签的列。如果给定一个序列,则使用 MultiIndex。如果您在每行末尾有一个带有分隔符的格式错误的文件,您可能会考虑index_col=False强制 pandas使用第一列作为索引(行名)

如果这仍然不起作用,您可以放弃使用delimiter,只需对两列使用转换器功能即可将数字与字母字符分开:

func = lambda x: x.split(':')[-1]
df1 = pd.read_csv("test.csv",
                  names = ["A", "B"],
                  engine = "python",
                  converters={'A': func,
                              'B': func})

输出:

     A    B
0   12   14
1    1    4
2    2    1
3   21   41

推荐阅读