使用Pandas或CSV模块将每行具有不同列数的CSV导入Pandas DataFrame的最佳方法是什么?
"H","BBB","D","Ajxxx Dxxxs"
"R","1","QH","DTR"," "," ","spxxt rixxls, raxxxd","1"
Run Code Online (Sandbox Code Playgroud)
使用此代码:
import pandas as pd
data = pd.read_csv("smallsample.txt",header = None)
Run Code Online (Sandbox Code Playgroud)
生成以下错误
Error tokenizing data. C error: Expected 4 fields in line 2, saw 8
Run Code Online (Sandbox Code Playgroud)
heo*_*noc 15
如果您想要真正简洁的内容而不显式给出列名称,您可以这样做:
df = pd.read_fwf('<filename>.csv', header=None)
df[0].str.split(',', expand=True)
Run Code Online (Sandbox Code Playgroud)
sha*_*hak 13
精修版PS答案如下。有用。请记住,我们在数据框中插入了很多缺失值。
### 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)
Run Code Online (Sandbox Code Playgroud)
在read_csv()中提供列名列表应该可以解决问题.
例如:名字= ['a','b','c','d','e']
https://github.com/pydata/pandas/issues/2981
编辑:如果您不想提供列名,那么请执行Nicholas建议的操作
您可以将列名称动态生成为简单计数器(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)
Run Code Online (Sandbox Code Playgroud)
缺失的值将分配给CSV行没有值的列.
标记数据时出错。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))
Run Code Online (Sandbox Code Playgroud)
使用范围而不是手动设置名称,因为当您有很多列时会很麻烦。
您可以使用 shantanu pathak 的方法来查找数据中最长的行长度。
此外,如果您需要使用偶数数据长度,您可以用 0 填充 NaN 值。例如。用于聚类(k-means)
new_data = data.fillna(0)
Run Code Online (Sandbox Code Playgroud)