使用Pandas导入每行具有不同列数的csv

时间:2014-11-19 15:10:12

标签: python pandas

使用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

6 个答案:

答案 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)

如果您想在不显式给出列名的情况下做得很简洁,可以这样做:

  • 制作一列DataFrame,每行是.csv文件中的一行
  • 将每行分隔为逗号并展开DataFrame

df = pd.read_fwf('<filename>.csv', header=None)

df[0].str.split(',', expand=True)