Pandas csv reader创建NaN索引

时间:2018-05-02 10:25:45

标签: python python-3.x pandas csv

我有一个包含以下内容的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

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

2 个答案:

答案 0 :(得分:1)

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

  

index_col:int或sequence或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

答案 1 :(得分:0)

看起来,这是分隔符的预期行为。对于正则表达式/非正则表达式分隔符和python / c引擎,它们是相同的,我们可以从以下示例中看到:

A 12 13 A 14 A
A 22 23 A 24 A
A 32 33 A 34 A

脚本

df2 = pd.read_csv("test1.csv", sep = "A", index_col = False, header = None, engine = "c")
print(df2)

在开头和结尾处生成一列NaN值:

    0        1   2   3
0 NaN   12 13   14 NaN
1 NaN   22 23   24 NaN
2 NaN   32 33   34 NaN

这有点令人惊讶,我原本期望引擎忽略不存在的值。好吧,我们现在都是代码的奴隶 最简单的方法似乎是在第一个例子中方便csv reader参数usecols

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

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

这使得脚本不够灵活,因为您必须事先知道数据结构。建议仍然受欢迎。