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

Eri*_*ich 9 python pandas

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

如果您想要真正简洁的内容而不显式给出列名称,您可以这样做:

  • 创建一列 DataFrame,每一行都是 .csv 文件中的一行
  • 用逗号分割每一行并展开 DataFrame
df = pd.read_fwf('<filename>.csv', header=None)
df[0].str.split(',', expand=True)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于非常基本的 csv 文件,并且带引号的字符串中没有逗号。因此 `a,b,"c,d,e",f` 将被解释为 `ab "cd e" f` 而不是 `abc,d,ef` (2认同)

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)


Bob*_*ner 7

在read_csv()中提供列名列表应该可以解决问题.

例如:名字= ['a','b','c','d','e']

https://github.com/pydata/pandas/issues/2981

编辑:如果您不想提供列名,那么请执行Nicholas建议的操作


P-S*_*P-S 7

您可以将列名称动态生成为简单计数器(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行没有值的列.

  • 最佳答案!也适用于 Jupyter 笔记本;) (2认同)

amr*_*sen 5

标记数据时出错。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)