【问题标题】:Merging CSV Rows with Common Data and Updating Count将 CSV 行与公共数据合并并更新计数
【发布时间】:2016-10-19 17:19:03
【问题描述】:

我有一个包含如下数据的 CSV:

document_id |身体提及 |计数

doc_01 |鲍勃 | 5

doc_03 |山姆 | 1

doc_04 |鲍勃 | 1

其中body_mention 是从文本中解析出来的名称,count 是该名称在某个文档中出现的次数 (document_id)。因此,Bob 在 doc_01 中出现了 5 次。

但是,我希望我的 CSV 更新,以便 Bob 的出现将简单地更新以前的 Bob 条目,所以新的更新看起来像:

document_id |身体提及 |计数

doc_01, doc_04 |鲍勃 | 6

doc_03 |山姆 | 1

有什么想法可以开始编写脚本吗?

【问题讨论】:

    标签: python csv pandas join


    【解决方案1】:

    这有点尴尬,但您可以使用两个默认字典,一个用于跟踪每个人的所有文档,另一个用于记录所有文档值的总和

    import csv
    import collections
    
    name_sum = collections.defaultdict(int)
    docs_for_name = collections.defaultdict(list)
    
    with open("csv1.csv") as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:
            name_sum[row[1]] += int(row[2])
            docs_for_name[row[1]].append(row[0])
    
    with open("outputcsv.csv", "w", newline="") as csvfile:
        csvwriter = csv.writer(csvfile)
        for key in sorted(name_sum.keys()):
            row = [", ".join(sorted(docs_for_name[key])), key, str(name_sum[key])]
            print(row)
            csvwriter.writerow(row)
    

    您没有发布实际的 csv 文件,只是 csv 文件在 excel 等编辑器中的样子,所以我假设您的 csv 看起来像这样:

    doc_01,Bob,5
    doc_03,Sam,1
    doc_04,Bob,1
    

    这最终会输出一个 csv 文件,例如:

    "doc_01, doc_04",Bob,6
    doc_03,Sam,1
    

    第一个默认字典 name_sum 只是跟踪每个名称的所有值的总和,所以它最终看起来像

    defaultdict(<class 'int'>, {'Bob': 6, 'Sam': 1})
    

    另一个用于跟踪名称的所有文档的默认字典 docs_for_name 最终看起来像:

    defaultdict(<class 'list'>, {'Bob': ['doc_01', 'doc_04'], 'Sam': ['doc_03']})
    

    那么您就拥有了在新的 csv 文件中写入每一行所需的所有信息

    【讨论】:

      【解决方案2】:

      您可以使用import pandas as pd; pd.read_csv()pandas 读取您的csv。然后您的数据可以存储在Dataframe 中,如下所示:

      df
      Out[86]: 
        document_id body_mention  count
      0      doc_01          Bob      5
      1      doc_03          Sam      1
      2      doc_04          Bob      1
      

      之后,为了实现你想要的,你可以使用以下两行代码:

      rslt = pd.concat([df.groupby('body_mention').sum(), df.groupby('body_mention').apply(lambda x: ','.join(x['document_id']))], axis=1).reset_index()
      rslt.columns = ['body_mention', 'count', 'document_id']
      

      解释

      In [91]: rslt = pd.concat([df.groupby('body_mention').sum(), df.groupby('body_mention').apply(lambda x: ','.join(x['document_id']))], axis=1).reset_index()
      
      In [92]: rslt
      Out[92]: 
        body_mention  count              0
      0          Bob      6  doc_01,doc_04
      1          Sam      1         doc_03
      
      In [93]: rslt.columns = ['body_mention', 'count', 'document_id']
      
      In [94]: rslt
      Out[94]: 
        body_mention  count    document_id
      0          Bob      6  doc_01,doc_04
      1          Sam      1         doc_03
      

      最后,您可以使用rslt.to_csv('rslt.csv') 将结果数据框保存到csv

      ps,如果您希望输出列遵循确切的顺序,只需使用以下内容:

      rslt = rslt[['document_id', 'body_mention', 'count']]
      
      rslt
      Out[99]: 
           document_id body_mention  count
      0  doc_01,doc_04          Bob      6
      1         doc_03          Sam      1
      

      【讨论】:

        【解决方案3】:

        试试这个:

        df.groupby("body_mention")['document_id'].apply(lambda x: ','.join(x))
        
        # body_mention
        # Bob    doc_01,doc_04
        # Sam           doc_03
        # Name: document_id, dtype: object
        
        df.groupby("body_mention")['count'].sum()
        
        #body_mention
        # Bob    6
        # Sam    1
        # Name: count, dtype: int64
        

        所以这两行:

            dfOut= pd.concat([df.groupby("body_mention")['count'].sum(),df.groupby("body_mention")['document_id'].apply(lambda x: ','.join(x)) ], axis=1)
            dfOut.to_csv('out.csv',sep = "|")
        

        csv 文件:

        body_mention|count|document_id
        Bob|6|doc_01,doc_04
        Sam|1|doc_03
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 2017-06-27
          相关资源
          最近更新 更多