python - 组合3个数据框,但需要按1列中的值重新对齐数据[重复]
Posted
技术标签:
【中文标题】python - 组合3个数据框,但需要按1列中的值重新对齐数据[重复]【英文标题】:python - combined 3 data frames, but need to realign data by values in 1 column [duplicate] 【发布时间】:2021-04-11 18:51:34 【问题描述】:我正在尝试使用多个数据源 - 几天前我提出了一个相关问题 (click here!
所以我有 3 个数据帧,每个数据帧都有一个“user_id”列,这在所有 3 个数据帧中都是通用的,但并非所有数据帧的大小都完全相同。
一开始我没有意识到,使用 pd.concat 将它们组合起来,但它们没有按 user_id 排列,我不知道如何实现。
这里有一些来自每个的示例数据,以及来自结果 concat 的示例数据(也许这有帮助?)
df1:
user_id duration
0 1000 116.830000
1 1001 328.092000
2 1002 259.043333
3 1003 1041.000000
4 1004 327.368750
5 1005 470.220000
6 1006 32.055000
7 1007 496.830000
8 1008 491.103333
9 1009 698.710000
df2:
user_id mb_used
0 1000 1902.000000
1 1001 16088.200000
2 1002 13432.000000
3 1003 27045.000000
4 1004 19544.500000
5 1005 17141.000000
6 1006 17094.000000
7 1007 28770.800000
8 1008 18491.333333
9 1009 23405.125000
df3:
user_id id
0 1000 11.000000
1 1001 41.400000
2 1002 29.333333
3 1003 50.000000
4 1004 22.125000
5 1005 11.000000
6 1006 77.000000
7 1007 51.000000
8 1008 28.000000
9 1011 53.000000
df 4 = pd.concat([df1,df2,df3],axis=1)
df4 结果:
user_id duration user_id mb_used user_id id
0 1000.0 116.830000 1000 1902.000000 1000.0 11.000000
1 1001.0 328.092000 1001 16088.200000 1001.0 41.400000
2 1002.0 259.043333 1002 13432.000000 1002.0 29.333333
3 1003.0 1041.000000 1003 27045.000000 1003.0 50.000000
4 1004.0 327.368750 1004 19544.500000 1004.0 22.125000
5 1005.0 470.220000 1005 17141.000000 1005.0 11.000000
6 1006.0 32.055000 1006 17094.000000 1006.0 77.000000
7 1007.0 496.830000 1007 28770.800000 1007.0 51.000000
8 1008.0 491.103333 1008 18491.333333 1008.0 28.000000
**9 1009.0 698.710000 1009 23405.125000 1011.0 53.000000**
我做错了什么,或者可以通过共享的 user_id 添加到行中,还是我应该使用不同的方法?老实说 - 我从 pd.merge 开始,但很快意识到我在试图构建它时不知所措,但如果这是唯一的方法(或最好的方法),我会再试一次。
提前感谢您的宝贵时间,对于可能缺少适当术语的问题,我深表歉意,我对 python (和一般编程)相当陌生
【问题讨论】:
from functools import reduce
dfs = [df1, df2, df3]
df_final = reduce(lambda left,right: pd.merge(left,right,on='user_id'), dfs)
user_id
在每个数据帧中是唯一的吗?
@tdelaney user_id 是所有三个数据帧的值,它们是同一用户的不同用途。
但这不是我问的。采取user_id mb_used
。同一个用户 ID 是否可以多次出现,例如 mb_used 在几个不同的媒体上?在这种情况下,这些数据帧中的行之间没有一一对应的关系。例如,在此示例中,可能需要对行求和以使 user_id 在数据框中唯一。
@tdelaney 抱歉,我误解了。不,user_id 不会出现多次,但并非所有用户 ID 都出现在所有数据帧中。当我使用最初建议的合并时,这创建了一些 NaN
【参考方案1】:
如果您想保留所有 3 个数据帧的 user_id,可以使用合并和外连接来完成,如下所示:
df4 = pd.merge(df1, df2, how="outer", on="user_id").merge(df3, how="outer", on="user_id")
【讨论】:
这很好用,谢谢!我知道这是一个非常基本的问题,所以我感谢您的时间和精力。 仅针对可能正在查看此内容的其他任何人-最终,我使用了 ZealousWeb 的解决方案,因为它包含一个外部连接,并且我发现并非所有 user_id 都出现在所有数据框中,从而创建了一些 NaN。包括如何="outer" 使这些记录不被丢弃,所以在我看来,这是最好的解决方案。【参考方案2】:改用merge
:
df4 = df1.merge(df2, on = "user_id").merge(df3, on = "user_id")
【讨论】:
完美运行,谢谢!我知道这可能是一个非常基本的问题,所以我很感谢你的时间。【参考方案3】:通过user_id
重新索引数据帧,然后在列轴上连接。连接将发生在行标签(即您设置的索引)上,不匹配的用户 id 获得 NaN。
df4 = pd.concat([d.set_index('user_id') for d in [df1, df2, df3]], axis=1)
【讨论】:
以上是关于python - 组合3个数据框,但需要按1列中的值重新对齐数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章