python—如何通过另一个Dataframe上的groupby查询为每个组分配一个值?

4jb9z9bj  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(306)

让以下dfs:

import numpy as np
import pandas as pd

df1 = pd.DataFrame({
    "k1": [1, 1, 2, 2, 3, 3, 4, 4, 4],
})

df2 = pd.DataFrame({
    "k2": [1, 1, 2, 2, 3, 4, 4],
    "v2": np.random.rand(7)
})

print(df1)
print("_______")
print(df2)
print("_______")

输出:

k1
0   1
1   1
2   2
3   2
4   3
5   3
6   4
7   4
8   4
_______
   k2        v2
0   1  0.260026
1   1  0.474951
2   2  0.695962
3   2  0.158575
4   3  0.396015
5   4  0.740344
6   4  0.293410
_______

我想为创建一个新列 df1 每把钥匙 k1 ,将应用相应的值,以便 k1 == k2 ,该值将是 v2 组中的 df2 谁的钥匙是 k2 .
上述情况所需的输出:

k1  result
0   1  0.474951
1   1  0.474951
2   2  0.695962
3   2  0.695962
4   3  0.396015
5   3  0.396015
6   4  0.740344
7   4  0.740344
8   4  0.740344

可以假设 k1 也在 k2 .
这可能是通过两个groupby操作完成的,一个用于查询,一个用于赋值,但我不知道如何将一个操作的输出与另一个操作的输入联系起来。

rqmkfv5c

rqmkfv5c1#

我们可以试试 map 以及 groupby ```
df1['result'] = df1['k1'].map(df2.groupby('k2')['v2'].max())

k1 result
0 1 0.474951
1 1 0.474951
2 2 0.695962
3 2 0.695962
4 3 0.396015
5 3 0.396015
6 4 0.740344
7 4 0.740344
8 4 0.740344

sh7euo9m

sh7euo9m2#

首先,你可以分类 k2 以及 v2 中的列 df2 以确保列中的值较大 v2 先别动。然后把复制品放在 k2 为了保持第一个,也就是最后的最大值,
map v2 中的列 k2df1 .

df1['result'] = df1['k1'].map(df2.sort_values(['k2', 'v2'], ascending=[True, False]).drop_duplicates('k2', keep='first').set_index('k2')['v2'])
print(df1)

   k1        result
0   1  0.303764
1   1  0.303764
2   2  0.026024
3   2  0.026024
4   3  0.213834
5   3  0.213834
6   4  0.757031
7   4  0.757031
8   4  0.757031

相关问题