【发布时间】: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 reducedfs = [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