基于 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
,因为在 df
和 dc
中有 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 文件的主要内容,如果未能解决你的问题,请参考以下文章