gpt4 book ai didi

python - 添加数据框并根据可用性划分结果

转载 作者:太空宇宙 更新时间:2023-11-03 12:23:07 24 4
gpt4 key购买 nike

我想添加两个数据框,我可以通过添加功能来实现。现在我想根据初始数据帧(df1、df2、df3)中是否存在相应值来划分结果数据帧的每个值。例如。

df1 = pd.DataFrame([[1,2],[3,4]], index =['A','B'], columns = ['C','D'])
df2 = pd.DataFrame([[11,12], [13,14]], index = ['A','B'], columns = ['D','E'])
df3 = df1.add(df2, fill_value=0)

这会导致 df 像

     C   D     E
A 1.0 13 12.0
B 3.0 17 14.0

我需要一个像这样的 df:

     C    D     E
A 1.0 6.5 12.0
B 3.0 8.5 14.0

因为在两个数据框中都找到了 D 列,所以我将这些值除以 2。任何人都可以提供一个通用的解决方案,假设我需要添加超过 2 个数据帧(因此划分因子也会改变)并且每个数据帧中有超过 100 列。

最佳答案

我们可以一步水平连接所有 DF:

In [13]: df = pd.concat([df1,df2], axis=1).fillna(0)

这会产生:

In [15]: df
Out[15]:
C D D E
A 1 2 11 12
B 3 4 13 14

现在我们可以按列分组,计算平均值(mean):

In [14]: df.groupby(df.columns, axis=1).mean()
Out[14]:
C D E
A 1.0 6.5 12.0
B 3.0 8.5 14.0

或者我们可以一步完成(感谢 @jezrael ):

In [60]: pd.concat([df1,df2], axis=1).fillna(0).groupby(level=0, axis=1).mean()
Out[60]:
C D E
A 1.0 6.5 12.0
B 3.0 8.5 14.0

时间:

In [38]: df1 = pd.concat([df1] * 10**5, ignore_index=True)

In [39]: df2 = pd.concat([df2] * 10**5, ignore_index=True)

In [40]: %%timeit
...: df = pd.concat([df1,df2], axis=1).fillna(0)
...: df.groupby(df.columns, axis=1).mean()
...:
63.4 ms ± 2.39 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [41]: %%timeit
...: s = pd.Series(np.concatenate([df1.columns, df2.columns])).value_counts()
...: df1.add(df2, fill_value=0).div(s)
...:
28.7 ms ± 712 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [42]: %%timeit
...: pd.concat([df1,df2]).mean(level = 0)
...:
65.5 ms ± 555 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [43]: df1.shape
Out[43]: (200000, 2)

In [44]: df2.shape
Out[44]: (200000, 2)

当前获胜者: @jezrael(28.7 ms ± 712 µs)-恭喜!

关于python - 添加数据框并根据可用性划分结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45731261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com