Python csv阅读器创建NaN索引

Python csv阅读器创建NaN索引,python,python-3.x,pandas,csv,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

我有一个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
为什么会发生这种情况以及如何防止这种情况?

函数接受一个指示数据帧(索引)行标签的
index\u col
参数。您需要使用
int
或索引序列设置this参数,因为默认情况下它是None

索引列
:int或sequence或False,默认无

列用作数据帧的行标签。如果给定序列,则使用多索引。如果在每行的末尾有一个带有分隔符的畸形文件,您可能会考虑<代码>索引xCalc= false < /C> >强制熊猫不使用第一列作为索引(行名称)

。 如果仍然不起作用,您可以使用
分隔符
删除,只需使用两列的转换函数将数字与字母字符分开:

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阅读器
参数
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

这会降低脚本的灵活性,因为您必须事先了解数据结构。建议仍然是受欢迎的。

index\u col=False
有一个有趣的效果。现在索引与预期一样,但是
A
包含
NaN
值和
B
包含
A
的值。这就好像我的第二个版本创建了一个只包含
NaN
值的附加列零。虽然我不明白为什么会发生这种情况。@Mr.t听起来好像是因为省略了这些列名或分隔符。可能是因为csv导入过程中的分隔符总是将一行拆分为两部分,但由于该行以第一个分隔符开头,它会创建一个NaN值列,而不是简单地忽略它?所以基本上,我的策略是愚蠢的,从一个分离器开始?@T先生是的,这是绝对可能的,但分离器不一定会分成两部分。正如评论中提到的,当分隔符的长度超过一个时,Pandas会将其视为正则表达式。我认为在这种情况下,只能使用空格作为分隔符。但这是我的策略,即创建比需要更多的列。如果第二个策略也像第一个策略一样创建不需要的列,我可能会回到
usecols=[1,3]