python-组合了3个数据帧,但需要按1列中的值重新对齐数据
我有几个数据源,我正试图与之合作——几天前我问了一个相关的问题( 因此,我有3个数据帧,每个数据帧都有一个“user_id”列,这在所有3个数据帧中都很常见,但并非所有数据帧的大小都完全相同 起初我没有意识到这一点,并使用pd.concat将它们组合起来,但它们并不是按用户id排列的,我不知道如何实现这一点 下面是来自每种方法的一些样本数据,以及来自结果concat的样本数据(可能有帮助?) df1: df2: df3: df4结果:python-组合了3个数据帧,但需要按1列中的值重新对齐数据,python,pandas,dataframe,Python,Pandas,Dataframe,我有几个数据源,我正试图与之合作——几天前我问了一个相关的问题( 因此,我有3个数据帧,每个数据帧都有一个“user_id”列,这在所有3个数据帧中都很常见,但并非所有数据帧的大小都完全相同 起初我没有意识到这一点,并使用pd.concat将它们组合起来,但它们并不是按用户id排列的,我不知道如何实现这一点 下面是来自每种方法的一些样本数据,以及来自结果concat的样本数据(可能有帮助?) df1: df2: df3: df4结果: user_id duration user_
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**
我是否做错了什么,或者可以通过共享用户id添加到行中,或者我应该使用不同的方法?老实说,我从pd.merge开始,但很快意识到我在试图构建它时有些不知所措,但如果这是唯一的方法(或最好的方法),我会再次尝试
提前感谢您的时间,我为可能缺少合适的术语表示歉意,我对python(以及一般编程)相当陌生。请改用
merge
:
df4 = df1.merge(df2, on = "user_id").merge(df3, on = "user_id")
通过
user\u id
对数据帧重新编制索引,然后在列轴上进行concat。将在具有不匹配用户id的行标签(即您设置的索引)上进行连接
df4 = pd.concat([d.set_index('user_id') for d in [df1, df2, df3]], axis=1)
如果要保留所有3个数据帧的用户id,可以使用以下合并和外部联接来实现:
df4 = pd.merge(df1, df2, how="outer", on="user_id").merge(df3, how="outer", on="user_id")
从functools导入reduce
dfs=[df1,df2,df3]
df_final=reduce(lambda左,右:pd.merge(左,右,on='user_id'),dfs)
用户id在每个数据帧中是否都是唯一的?@tdelaney用户id是所有三个数据帧中的值,它们是同一用户的不同用法。但这不是我所要求的。以用户id mb_used
为例。同一用户id是否可以多次出现在其中,例如,mb_在多个不同的媒体上使用?在这种情况下,没有t这些数据帧中的行之间存在一对一的对应关系。例如,在本例中,可能需要对行进行求和,以使用户id在数据帧中唯一。@t抱歉,我误解了。不,用户id不会出现多次,但并非所有用户id都出现在所有数据帧中。这在我使用首字母时产生了一些NaN谢谢!我知道这可能是一个非常基本的问题,所以我很感谢你的时间。这很好,谢谢!我知道这是一个非常基本的问题,所以我很感谢你的时间和努力。对于其他可能会看到这一点的人,我最终使用了ZealousWeb的解决方案,因为它包含一个外部join和我发现并非所有的用户ID都出现在所有的数据帧中,从而产生了一些NAN。包括如何=“outer”保持这些记录不被删除,所以在我看来,这是最好的解决方案。
df4 = df1.merge(df2, on = "user_id").merge(df3, on = "user_id")
df4 = pd.concat([d.set_index('user_id') for d in [df1, df2, df3]], axis=1)
df4 = pd.merge(df1, df2, how="outer", on="user_id").merge(df3, how="outer", on="user_id")