gpt4 book ai didi

python - pandas 数据库合并多列未正确合并

转载 作者:行者123 更新时间:2023-12-01 04:35:46 25 4
gpt4 key购买 nike

我遇到了以下问题。我想合并多个列上的两个数据框(确切地说是 11 列)。令人惊讶的是,通常的方法不起作用。示例数据帧如下:df1:

c1  c2  c3  c4  c5  c6  event_count
1 2 a ff 0 1 5
1 2 b fg 1 3 6
1 2 c hg 2 4 20
1 2 d gf 0 1 7
1 2 e fg 1 4 1

df2:

c1  c2  c3  c4  c5  c6  event_type  event_price
1 2 a ff 0 1 a 20
1 2 b fg 1 3 a 20
1 2 c hg 2 4 b 30
1 2 d gf 0 1 b 40
1 2 e fg 1 4 b 50

我试过了

result = pd.merge(df1, df2, how='outer', on = ['c1','c2','c3','c4','c5','c6'])

而且这在技术上应该可行:

result = pd.merge(df1, df2, how='outer')

但我明白了:

c1  c2  c3  c4  c5  c6  event_count event_type  event_price
1 2 a ff 0 1 5
1 2 b fg 1 3 6
1 2 c hg 2 4 20
1 2 d gf 0 1 7
1 2 e fg 1 4 1
1 2 a ff 0 1 a 20
1 2 b fg 1 3 a 20
1 2 c hg 2 4 b 30
1 2 d gf 0 1 b 40
1 2 e fg 1 4 b 50

当我想要得到这个时:

c1  c2  c3  c4  c5  c6  event_count event_type  event_price
1 2 a ff 0 1 5 a 20
1 2 b fg 1 3 6 a 20
1 2 c hg 2 4 20 b 30
1 2 d gf 0 1 7 b 40
1 2 e fg 1 4 1 b 50

我也尝试过使用索引:

df1_index = df1.set_index(['c1', 'c2','c3'....]); df2_index =df2.set_index(['c1', 'c2','c3'....]); result = pd.concat([df1_index, df2_index], axis=1);

但这给出了同样的错误结果。我确保两个表的数据类型也相同。我不知道还能尝试什么。有什么建议吗?谢谢:)

最佳答案

如果一个 DataFrame 中的值是数字字符串,而另一个 DataFrame 中的值是数字,则可能会发生您所描述的行为。它们看起来相同,但比较起来却有所不同。

例如,请考虑下面的 df1df2。它们的 c 列完全相同,只是 df1['c1'] 包含字符串,而 df2['c1'] 包含整数。

import pandas as pd
df1 = pd.DataFrame({'c1': ['1', '1', '1', '1', '1'],
'c2': [2, 2, 2, 2, 2],
'c3': ['a', 'b', 'c', 'd', 'e'],
'c4': ['ff', 'fg', 'hg', 'gf', 'fg'],
'c5': [0, 1, 2, 0, 1],
'c6': [1, 3, 4, 1, 4],
'event_count': [5, 6, 20, 7, 1]})

df2 = pd.DataFrame({'c1': [1, 1, 1, 1, 1],
'c2': [2, 2, 2, 2, 2],
'c3': ['a', 'b', 'c', 'd', 'e'],
'c4': ['ff', 'fg', 'hg', 'gf', 'fg'],
'c5': [0, 1, 2, 0, 1],
'c6': [1, 3, 4, 1, 4],
'event_price': [20, 20, 30, 40, 50],
'event_type': ['a', 'a', 'b', 'b', 'b']})

合并无法匹配任何行,因为 1 != '1':

print(pd.merge(df1, df2, how='outer'))
# c1 c2 c3 c4 c5 c6 event_count event_price event_type
# 0 1 2 a ff 0 1 5 NaN NaN
# 1 1 2 b fg 1 3 6 NaN NaN
# 2 1 2 c hg 2 4 20 NaN NaN
# 3 1 2 d gf 0 1 7 NaN NaN
# 4 1 2 e fg 1 4 1 NaN NaN
# 5 1 2 a ff 0 1 NaN 20 a
# 6 1 2 b fg 1 3 NaN 20 a
# 7 1 2 c hg 2 4 NaN 30 b
# 8 1 2 d gf 0 1 NaN 40 b
# 9 1 2 e fg 1 4 NaN 50 b

如果我们将数字字符串转换为数字,然后合并按预期成功:

df1 = df1.convert_objects(numeric=True)
df2 = df2.convert_objects(numeric=True) # not necessary in my example, but may be necessary for you if the numeric strings are in df2.
print(pd.merge(df1, df2, how='outer'))

产量

   c1  c2 c3  c4  c5  c6  event_count  event_price event_type
0 1 2 a ff 0 1 5 20 a
1 1 2 b fg 1 3 6 20 a
2 1 2 c hg 2 4 20 30 b
3 1 2 d gf 0 1 7 40 b
4 1 2 e fg 1 4 1 50 b

虽然 df1 = df1.convert_objects(numeric=True) 可能会解决您的问题,但它当 df1 和/或首先定义df2

关于python - pandas 数据库合并多列未正确合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com