Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-组合了3个数据帧,但需要按1列中的值重新对齐数据_Python_Pandas_Dataframe - Fatal编程技术网

python-组合了3个数据帧,但需要按1列中的值重新对齐数据

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_

我有几个数据源,我正试图与之合作——几天前我问了一个相关的问题(

因此,我有3个数据帧,每个数据帧都有一个“user_id”列,这在所有3个数据帧中都很常见,但并非所有数据帧的大小都完全相同

起初我没有意识到这一点,并使用pd.concat将它们组合起来,但它们并不是按用户id排列的,我不知道如何实现这一点

下面是来自每种方法的一些样本数据,以及来自结果concat的样本数据(可能有帮助?)

df1:

df2:

df3:

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**
我是否做错了什么,或者可以通过共享用户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")