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列中的值重新对齐数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

访问 dataGridView 列中的组合框?

通过按 python 中数据框列中的值分组来创建字典

如何链接多个组合框表中的两个组合框?

从 Python 数据框的一列中的每一行中删除前 x 个字符

将组合框日期与datadable框进行比较

包含来自访问中的多个字段的数据的组合框