python - 用熊猫读取具有可变列数的csv
问题描述
我有一个列数可变的 csv 文件。
Pandas 可以使用该参数相当轻松地处理这种情况name
。如果文件的第一行长度相同或更短,则此方法有效names
,但如果更长,则失败。
例子
情况1
第一行的元素数量与names
from io import StringIO
import pandas as pd
file = StringIO(
'''1, 2, 3,
1, 2
1, 2, 3, 4,
1, 2, 3,''')
df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df
# Out[0]:
# A B C
# 0 1 2 3.0
# 1 1 2 NaN
# 2 1 2 3.0
# 3 1 2 3.0
这行得通。
案例2
第一行的元素少于names
from io import StringIO
import pandas as pd
file = StringIO(
'''1, 2,
1, 2
1, 2, 3, 4,
1, 2, 3,''')
df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df
# Out[0]:
# A B C
# 0 1 2 NaN
# 1 1 2 NaN
# 2 1 2 3.0
# 3 1 2 3.0
这也有效。
案例3
第一行的元素多于names
from io import StringIO
import pandas as pd
file = StringIO(
'''1, 2, 3, 4,
1, 2
1, 2, 3, 4,
1, 2, 3,''')
df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df
# Expected output:
# A B C
# 0 1 2 3.0
# 1 1 2 NaN
# 2 1 2 3.0
# 3 1 2 3.0
#
# Instead I get:
# IndexError: list index out of range
这不行!!!
问题
有没有办法让这个脚本更健壮,以便它也可以处理案例 3 而不会产生错误?这看起来是不是有点像bug
我正在运行熊猫版本 0.23.4
编辑:
案例 3b
第一行的元素多于names
from io import StringIO
import pandas as pd
file = StringIO(
'''1, 2, 3, 4
1, 2
1, 2, 3, 4,
1, 2, 3,''') # NOTE: No comma after the first "4"!!
df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df
#Out[0]:
# A B C
# 0 1 2 3.0
# 1 1 2 NaN
# 2 1 2 3.0
# 3 1 2 3.0
这行得通!!!
这到底是怎么回事?
解决方案
只需使用usecols
参数,而不是那个names
。names
假设您要列出所有列的名称,而usecols
假设列的子样本。
from io import StringIO
import pandas as pd
file = StringIO(
'''1, 2, 3, 4,
1, 2
1, 2, 3, 4,
1, 2, 3,''')
df = pd.read_csv(file, usecols =[0,1,2], header = None)
df
0 1 2
0 1 2 3.0
1 1 2 NaN
2 1 2 3.0
3 1 2 3.0
推荐阅读
- visual-c++ - 问题在 CMFCEditBrowseCtrl 上启用文件夹浏览按钮
- c# - 如何在设置器上设置静态变量以触发 wpf c#
- vue.js - 使用 Vue 和 Nuxt 商店,我如何在构建时从 API 中获取,而不是从客户端获取?
- encryption - openssl SMIME 和多部分消息
- swift - 如何设置多个合并计时器发布者?
- python - 在 AI-Platform-Notebooks 中使用 BigQuery 的 ContextualVersionConflict
- google-apps-script - 使用 Google Apps 上传的文件已损坏
- c++ - 如何将基类的未知子类放在一个数据结构中并在 C++ 中调用重写的基类函数
- javascript - 提示不将值存储为字符串
- python - 如何设置超时