繁体   English   中英

熊猫csv阅读器创建NaN索引

[英]Pandas csv reader creates NaN index

我有一个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

为什么会发生这种情况,如何预防呢?

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

index_col :int或sequence或False,默认为None

用作DataFrame的行标签的列。 如果给出了序列,则使用MultiIndex。 如果您在每行末尾都有一个带有定界符的格式错误的文件,则可以考虑index_col=False来强制熊猫不要将第一列用作索引(行名)

如果仍然delimiter ,则可以使用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

看来,这是分隔符的预期行为。 从正则表达式/非正则表达式分隔符和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

这使脚本不太灵活,因为您必须事先了解数据结构。 仍然欢迎提出建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM