【问题标题】:How to read a csv file with Pandas with more delimiters in the rows that in the header?如何使用 Pandas 在标题中的行中使用更多分隔符读取 csv 文件?
【发布时间】:2019-09-10 00:35:56
【问题描述】:

我想使用 Pandas 的 read_csv 函数读取一个 csv 文件,该文件在标题中的行中有更多分隔符。 Pandas 认为第一列是多索引的。 “NAME”列可以有任意数量的分隔符,受影响的列可以是任何一个(我们不知道哪一个受到影响),甚至不止一个。

我尝试调整 read_csv 的关键字参数,但没有成功。我正在使用 Python 3.7.0 和 Pandas 0.25.0。但是,Excel 可以正确读取文件。

import pandas

with open('test.csv', mode='w') as csv_file:
    csv_file.write('A,NAME,B\n')
    csv_file.write('a, Peter, Parker, b\n')

df = pandas.read_csv('test.csv', header=0, delimiter=',')
print(df)

预期输出:

   A            NAME   B
0  a   Peter, Parker   b

实际输出:

    A     NAME   B
a   Peter   Parker   b

其他例子:

import pandas

with open('test.csv', mode='w') as csv_file:
    csv_file.write('A,NAME,B,PLACE\n')
    csv_file.write('a, Peter, Parker, b, Queens, New York City\n')

df = pandas.read_csv('test.csv', header=0, delimiter=',')
print(df)

预期输出:

   A            NAME   B                 PLACE
0  a   Peter, Parker   b Queens, New York City

实际输出:

                A NAME        B           PLACE
a  Peter   Parker    b   Queens   New York City

【问题讨论】:

  • 每个NAME都有这种格式吗?
  • 没有。每行中可以存在任意数量的分隔符,但所有行都相同。
  • 好的,有很多方法可以解决这个问题,但这样构造数据是没有意义的。谁制作这样的csv文件?如果您想要一个合适的解决方案,我建议您提供更多涵盖所有可能性的数据。

标签: python pandas csv dataframe


【解决方案1】:

不是这样的

df = pandas.read_csv('test.csv', header=0, delimiter=',')
df = df.reset_index()
df["NAME"] = df["A"] + ", " + df["NAME"]
df["A"] = df["Unnamed: 0"]
df = df.drop("Unnamed: 0", axis=1)

可能吗?它没有完全回答这个问题,但可以为您的 df 解决问题。

编辑:另一种可能性,如果文件也有 .xls/.xlsx 格式,pd.read_excel("name.xls") 应该可以解决您的问题

【讨论】:

    【解决方案2】:

    解决方法:

    with open('test.csv', mode='w') as csv_file:  
        csv_file.write('A,NAME,B\n')  
        csv_file.write('a, Peter, Parker, b\n')  
        csv_file.write('aa, John, Lee, Mary, bb\n')            
    
    df=pd.DataFrame(columns=["A","NAMES","B"])                                                                           
    
    with open("test.csv") as ff:  
       for line in ff:  
           A,N= line.split(",",maxsplit=1)  
           N,B= N.rsplit(",",maxsplit=1)  
           df.loc[len(df.index)]= [A.strip(),N.strip(),B.strip()] 
    
    df.drop(0,axis="index")
    
        A            NAMES   B
    1   a    Peter, Parker   b
    2  aa  John, Lee, Mary  bb
    

    【讨论】:

    • 我已编辑问题以澄清影响列可以是任何人。甚至不止一个。
    • @aciba 有什么规则?您必须在列中指定部件号。
    【解决方案3】:
    # Read first line as a list using ',' as delimiter
    with open('test.csv', 'r') as f:
      header = f.readline().replace('\n', '').split(',')
    # Read file skipping first line (header) using two character delimiter ', '
    df = pandas.read_csv('test.csv', skiprows = 1, header = None, delimiter=', ', engine = 'python')
    header = header + ["missing-column"] # In your example file header has only 3 columns but data has 4
    # Assign header list as dataframe columns names
    df.columns = header
    print(df)
    

    【讨论】:

    • "# 在您的示例文件头中只有 3 列,但数据有 4" 正是问题所在。 Pandas 希望 Pandas 足够聪明,能够将“彼得,帕克”理解为一个专栏。
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2022-10-14
    • 2020-12-22
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多