【问题标题】:How to split CSV column data into two colums in Python如何在 Python 中将 CSV 列数据拆分为两列
【发布时间】:2020-05-12 17:32:31
【问题描述】:

我有以下代码(如下),它抓取 CSV 文件并将数据合并到一个合并的 CSV 文件中。

我现在需要从其中一列中获取特定信息,然后将该信息添加到另一列。

我现在拥有的是一个 output.csv 文件,其中包含以下示例数据:

ID,Name,Flavor,RAM,Disk,VCPUs
45fc754d-6a9b-4bde-b7ad-be91ae60f582,customer1-test1-dns,m1.medium,4096,40,2
83dbc739-e436-4c9f-a561-c5b40a3a6da5,customer2-test2,m1.tiny,128,1,1
ef68fcf3-f624-416d-a59b-bb8f1aa2a769,customer3-test3-dns-api,m1.medium,4096,40,2

我需要做的是打开这个 CSV 文件并将名称列中的数据分成两列,如下所示:

ID,Name,Flavor,RAM,Disk,VCPUs,Customer,Misc
45fc754d-6a9b-4bde-b7ad-be91ae60f582,customer1-test1-dns,m1.medium,4096,40,2,customer1,test1-dns
83dbc739-e436-4c9f-a561-c5b40a3a6da5,customer2-test2,m1.tiny,128,1,1,customer2,test2
ef68fcf3-f624-416d-a59b-bb8f1aa2a769,customer3-test3-dns-api,m1.medium,4096,40,2,customer3,test3-dns-api

请注意 Misc 列如何将多个值拆分为一个或多个 -

我怎样才能通过 Python 实现这一点。下面是我现在的代码:

import csv
import os
import pandas as pd

by_name = {}
with open('flavor.csv') as b:
    for row in csv.DictReader(b):
        name = row.pop('Name')
        by_name[name] = row

with open('output.csv', 'w') as c:
    w = csv.DictWriter(c, ['ID', 'Name', 'Flavor', 'RAM', 'Disk', 'VCPUs'])
    w.writeheader()

    with open('instance.csv') as a:
        for row in csv.DictReader(a):
            try:
                match = by_name[row['Flavor']]
            except KeyError:
                continue

            row.update(match)

            w.writerow(row)

【问题讨论】:

  • 您使用库csv 超过pandas 是因为pandas 不起作用还是因为您更熟悉库csv?如果pd.read_csv("'flavor.csv'") 有效,我可以参考一个完全利用pandas 的示例。
  • 我目前只使用 csv。我对 pandas 不是很熟悉,但我在网上找到的大多数解决方案都需要 pandas,所以我导入它是为了继续使用它。它目前没有被使用。

标签: python pandas csv export-to-csv


【解决方案1】:

试试这个:

import pandas as pd

df = pd.read_csv('flavor.csv')
df[['Customer','Misc']] = df.Name.str.split('-', n=1, expand=True)
df

输出:


                                     ID                     Name     Flavor   RAM  Disk  VCPUs   Customer           Misc
0  45fc754d-6a9b-4bde-b7ad-be91ae60f582      customer1-test1-dns  m1.medium  4096    40      2  customer1      test1-dns
1  83dbc739-e436-4c9f-a561-c5b40a3a6da5          customer2-test2    m1.tiny   128     1      1  customer2          test2
2  ef68fcf3-f624-416d-a59b-bb8f1aa2a769  customer3-test3-dns-api  m1.medium  4096    40      2  customer3  test3-dns-api

【讨论】:

    【解决方案2】:

    我建议切换到pandas。这是官方Getting Started documentation

    让我们先读入 csv。

    import pandas as pd
    
    df = pd.read_csv('input.csv')
    
    print(df.head(1))
    

    你应该得到类似的东西:

    ID  Name    Flavor  RAM Disk    VCPUs
    0   45fc754d-6a9b-4bde-b7ad-be91ae60f582    customer1-test1-dns m1.medium   4096    40  2
    

    之后,在 Pandas 系列中使用字符串操作:

    df[['Customer','Misc']] = df.Name.str.split('-', n=1, expand=True)
    

    最后,您可以保存 csv。

    df.to_csv('output.csv')
    

    【讨论】:

      【解决方案3】:

      如果你使用 pandas,这段代码会更加优雅和简单。

      import pandas as pd
      
      df = pd.read_csv('flavor.csv')
      
      df[['Customer','Misc']] = df['Name'].str.split(pat='-',n=1,expand=True)
      
      df.to_csv('output.csv',index=False)
      

      Documentation ref

      【讨论】:

        【解决方案4】:

        这是我的做法。诀窍在于函数“split()”:

        import pandas as pd
        file = pd.read_csv(r"C:\...\yourfile.csv",sep=",")
        
        file['Customer']=None
        file['Misc']=None
        for x in range(len(file)):
            temp=file.Name[x].split('-', maxsplit=1)
            file['Customer'].iloc[x] = temp[0]
            file['Misc'].iloc[x] = temp[1]
        
        file.to_csv(r"C:\...\yourfile_result.csv")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-15
          • 2022-01-20
          • 2016-10-07
          • 2021-12-21
          • 1970-01-01
          • 2021-04-26
          相关资源
          最近更新 更多