[英]Reading a csv-file with pandas.read_csv and an index creates NaN entries
[英]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.