使用Pandas或CSV模块将每行的列数不同的CSV导入到Pandas DataFrame中的最佳方法是什么。
"H","BBB","D","Ajxxx Dxxxs"
"R","1","QH","DTR"," "," ","spxxt rixxls, raxxxd","1"
使用此代码:
import pandas as pd
data = pd.read_csv("smallsample.txt",header = None)
生成以下错误
Error tokenizing data. C error: Expected 4 fields in line 2, saw 8
答案 0 :(得分:6)
在read_csv()中提供列名列表应该可以解决问题。
例如:姓名= [' a',' b',' c',' d',' e&# 39]
https://github.com/pydata/pandas/issues/2981
编辑:如果您不想提供列名,请执行Nicholas建议
答案 1 :(得分:6)
您可以动态生成列名称作为简单计数器(0、1、2等)。
动态生成列名
# Input
data_file = "smallsample.txt"
# Delimiter
data_file_delimiter = ','
# The max column count a line in the file could have
largest_column_count = 0
# Loop the data lines
with open(data_file, 'r') as temp_f:
# Read the lines
lines = temp_f.readlines()
for l in lines:
# Count the column count for the current line
column_count = len(l.split(data_file_delimiter)) + 1
# Set the new most column count
largest_column_count = column_count if largest_column_count < column_count else largest_column_count
# Close file
temp_f.close()
# Generate column names (will be 0, 1, 2, ..., largest_column_count - 1)
column_names = [i for i in range(0, largest_column_count)]
# Read csv
df = pandas.read_csv(data_file, header=None, delimiter=data_file_delimiter, names=column_names)
# print(df)
Missing values将分配给您的CSV行没有值的列。
答案 2 :(得分:3)
标记数据时出错。 C错误:第2行中应有4个字段,看到8
该错误为解决“第2行中预期有4个字段”问题提供了线索,锯8表示第二行的长度为8,第一行的长度为4。
import pandas as pd
# inside range set the maximum value you can see in "Expected 4 fields in line 2, saw 8"
# here will be 8
data = pd.read_csv("smallsample.txt",header = None,names=range(8))
使用范围而不是手动设置名称,因为当您有很多列时,这会很麻烦。
您可以使用shantanu pathak的方法来查找数据中最长的行长度。
此外,如果需要使用偶数数据长度,则可以用0填充NaN值。例如。用于聚类(k均值)
new_data = data.fillna(0)
答案 3 :(得分:2)
我们甚至可以使用pd.read_table()
方法来读取csv文件,该文件将其转换为单列的DataFrame
类型,可以通过&#39;来读取和拆分,
答案 4 :(得分:1)
P.S。的抛光版答案如下。有用。 请记住,我们在数据框中插入了许多缺失值。
### Loop the data lines
with open("smallsample.txt", 'r') as temp_f:
# get No of columns in each line
col_count = [ len(l.split(",")) for l in temp_f.readlines() ]
### Generate column names (names will be 0, 1, 2, ..., maximum columns - 1)
column_names = [i for i in range(0, max(col_count))]
### Read csv
df = pd.read_csv("smallsample.txt", header=None, delimiter=",", names=column_names)
答案 5 :(得分:0)
如果您想在不显式给出列名的情况下做得很简洁,可以这样做:
df = pd.read_fwf('<filename>.csv', header=None)
df[0].str.split(',', expand=True)