我有一个包含以下内容的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
为什么会发生这种情况以及如何防止它?
答案 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
这使得脚本不够灵活,因为您必须事先知道数据结构。建议仍然受欢迎。