基于 1 列和另一组的值合并 2 个 csv 文件

Posted

技术标签:

【中文标题】基于 1 列和另一组的值合并 2 个 csv 文件【英文标题】:Merge 2 csv file based on 1 column and value of the other group 【发布时间】:2021-07-20 05:17:03 【问题描述】:

我想根据日期合并两个 csv 文件,但我想将第二个文件的列的值放在第一个文件的“类型”列中的相关值前面。

这是我想要的一个例子:

第一个数据:

data = 'type': ['a', 'a','b','b', 'c', 'd'],
        'Date': ['2007-05-10', '1996-05-01', 
                 '1996-05-01','1996-02-02', 
                 '1996-02-02','1990-01-05']

df = pd.DataFrame(data) 
  type  Date
0   a   2007-05-10
1   a   1996-05-01
2   a   1996-05-01
3   b   1996-02-02
4   c   1996-02-02
5   d   1990-01-05

第二个数据:

data2 = 'Date': ['2007-05-10', '1996-05-01','1996-05-01','1996-02-02', '1996-02-02','1990-01-05'], 
        'a': [2,3,5,6,7,9], 'b':[4,7,7,6,6,2], 'c':[1,3,5,4, 4,'NAN'], 'd': [2,3,5,7,9,'NAN']  

dc = pd.DataFrame(data2)
      Date      a   b   c   d
0   2007-05-10  2   4   1   2
1   1996-05-01  3   7   3   3
2   1996-05-01  5   7   5   5
3   1996-02-02  6   6   4   7
4   1996-02-02  7   6   4   9
5   1990-01-05  9   2   NAN NAN

输出应该是:

  type    Date      rate
0   a   2007-05-10  2
1   a   1996-05-01  3
2   b   1996-05-01  7
3   b   1996-02-02  6
4   c   1996-02-02  4
5   d   1990-01-05  NAN

如何合并这些 csv 文件以实现上述输出?

非常感谢。

【问题讨论】:

【参考方案1】:

您可以在第二个数据框 dc 上执行 melt 以将其变为可以使用第一个数据框 df 执行 merge 的形状。

df.merge(
     pd.melt(dc, id_vars=['Date'], value_vars=['a', 'b', 'c', 'd'],
     var_name = 'type', value_name = 'rate'), on = ['type', 
     'Date']).drop_duplicates().reset_index(drop = True)

输出:

  type    Date    rate
0   a   2007-05-10  2
1   a   1996-05-01  3
2   a   1996-05-01  5
3   b   1996-05-01  7
4   b   1996-02-02  6
5   c   1996-02-02  4
6   d   1990-01-05  NAN

现在您看到它在合并中标识了三行 a,因为在 dfdc 中有 3 行匹配。

但如果您的意图是根据 ['type', 'Date'] 删除重复项,那么您始终可以使用 subset 选项执行 drop_duplicates

在子集上使用 drop_duplicates 它会看起来:

df.merge(
   pd.melt(dc, id_vars=['Date'], value_vars=['a', 'b', 'c', 'd'], 
   var_name = 'type', value_name = 'rate'), on = ['type', 
  'Date']).drop_duplicates(subset = ['type', 'Date']).reset_index(drop = True)

输出:

  type    Date    rate
0   a   2007-05-10  2
1   a   1996-05-01  3
2   b   1996-05-01  7
3   b   1996-02-02  6
4   c   1996-02-02  4
5   d   1990-01-05  NAN

【讨论】:

谢谢你,它的工作。我使用了第一个脚本,但是为什么它会删除很多行(也没有删除功能)? 我用过:df.merge( pd.melt(dc, id_vars=['Date'], value_vars=['a', 'b', 'c', 'd'], var_name = 'type', value_name = 'rate'), on = ['type', 'Date']) 有了你问的问题中的数据,我在第一个脚本中得到了 9 行没有 drop_duplicates 的行。你得到了多少行? 在问题的数据中,我也是,但在我有 1000 行的主要数据中。我猜如果没有匹配的值,它将从主数据中删除,而不是将 NA 放在合并数据上。对吗? 如果您想要左侧数据框中的主要数据,您可以在合并中使用how = 'left'

以上是关于基于 1 列和另一组的值合并 2 个 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

根据特定列合并多个 CSV 文件 - Python

合并 2 个具有相同键的对象,来自 2 个数组的值

在 Pandas 中合并列和排序

合并多个 CSV 文件并删除 R 中的重复项

在另一列满足条件后计算一列中的值

Pandas 基于列合并 csv