【问题标题】:how to add the value to the row that are similar in ID's?如何将值添加到 ID 中相似的行?
【发布时间】:2020-12-05 07:28:22
【问题描述】:

我正在合并到不同的 CSV 文件:

输入一个.csv:

myID name  day age
111  james Feb 29
112  alexs Mar 19
113  kevin Jan 18
114  bratt Jul 22
115  nancy Apr 30

输入 b.csv:

myID visitedCity
111  boston
111  san fran
111  paris
112  texas
113  fargo
114  austin   
114  los alto
115  memphis

正如它所显示的,文件b.CSV 具有与a.CSV 中使用的相同的myID 列名,并且包含相似的ID,但是,文件b.CSV 包含重复的ID,显示访问了多少个城市。
问题是:如何将输入a.CSV 中的数据合并到b.CSV,如下所示:

myID visitedCity name  day age
111  boston      james Feb 29
111  san fran    james Feb 29
111  paris       james Feb 29
112  texas       alexs Mar 19
113  fargo       kevin Jan 18
114  austin      bratt Jul 22
114  los alto    bratt Jul 22
115  memphis     nancy Apr 30

我已经查看了一些帖子,例如this,但这不是我想要的。

【问题讨论】:

    标签: python


    【解决方案1】:

    使用merge 命令。

    >>> import pandas as pandas
    >>> adf = pandas.DataFrame([[111, 'james', 'Feb', 29]])
    >>> adf.columns = ['myID', 'name', 'day', 'age']
    >>> adf
       myID   name  day  age
    0   111  james  Feb   29
    >>> bdf = pandas.DataFrame([[111, 'boston'], [111, 'san fran']])
    >>> bdf.columns = ['myID', 'visitiedCity']
    >>> bdf
       myID visitiedCity
    0   111       boston
    1   111     san fran
    >>> df = pandas.merge(bdf, adf, how='outer', on=['myID'], indicator=False)
    >>> df
       myID visitiedCity   name  day  age
    0   111       boston  james  Feb   29
    1   111     san fran  james  Feb   29
    

    更多信息可以找到https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

    【讨论】:

      【解决方案2】:

      DataFrame 和 Pandas 将是做到这一点的最佳方式。但是,我试图找出这是否也可以使用基本循环来完成。这是我使用列表理解能够做的事情。

      我将使用每一行作为一个字符串。然后我只需要比较每行中的前 4 个字符。这就是我的做法。它只是一个两行代码。

      x = [
      'myID name  day age',
      '111  james Feb 29',
      '112  alexs Mar 19',
      '113  kevin Jan 18',
      '114  bratt Jul 22',
      '115  nancy Apr 30']
      y = [
      'myID visitedCity',
      '111  boston',
      '111  san fran',
      '111  paris',
      '112  texas',
      '113  fargo',
      '114  austin',
      '114  los alto',
      '115  memphis']
      
      k = [i.ljust(16,' ')+j[4:] for i in y for j in x if i[:3] == j[:3]]
      for x in k: print(x)
      

      输出如下:

      myID visitedCity name  day age
      111  boston      james Feb 29
      111  san fran    james Feb 29
      111  paris       james Feb 29
      112  texas       alexs Mar 19
      113  fargo       kevin Jan 18
      114  austin      bratt Jul 22
      114  los alto    bratt Jul 22
      115  memphis     nancy Apr 30 
      

      【讨论】:

      • 谢谢。这是一个很好的尝试解决方案,我学到了一些东西。
      【解决方案3】:

      试试

      import pandas as pd
      aDf= pd.read_csv('a.csv')
      bDf =pd.read_csv('b.csv')
      
      ResultDf=pd.merge( bDf, aDf, how='left', on='myID')
      

      【讨论】:

        猜你喜欢
        • 2023-01-05
        • 1970-01-01
        • 2021-05-18
        • 2023-02-22
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        • 2019-02-17
        相关资源
        最近更新 更多