Python 如何通过另一个数据帧上的groupby查询为每个组分配值?

Python 如何通过另一个数据帧上的groupby查询为每个组分配值?,python,pandas,dataframe,Python,Pandas,Dataframe,让以下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("

让以下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("_______")
输出:

我想为
df1
创建一个新列,这样对于每个键
k1
,将应用一个相应的值,这样如果
k1
=
k2
,该值将是
df2
中键为
k2
k1
)的组的
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
可以假设
k1
中存在的所有键也在
k2


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


编辑:

请注意,示例
k1
k2
为清晰起见进行了排序,但不能保证是正确的。我也不想排序,因为
o(nlogn)
时间,这可以在
o(n)
中完成,首先,您可以在
df2
中的
k2
v2
列上排序,以确保列
v2
中的较大值保持在第一位。然后将副本放在
k2
上,以保留第一个,即最大值。最后,
k2
中的
v2
列映射到
df1

df1['result']=df1['k1'].map(df2.sort_值(['k2',v2'],升序=[True,False])。删除重复项('k2',keep='first')。设置_索引('k2')['v2'])

首先,您可以对
df2
中的
k2
v2
列进行排序,以确保列
v2
中的较大值保持在第一位。然后将副本放在
k2
上,以保留第一个,即最大值。最后,
k2
中的
v2
列映射到
df1

df1['result']=df1['k1'].map(df2.sort_值(['k2',v2'],升序=[True,False])。删除重复项('k2',keep='first')。设置_索引('k2')['v2'])

我们可以尝试
map
groupby

df1['result'] = df1['k1'].map(df2.groupby('k2')['v2'].max())


我们可以尝试
map
groupby

df1['result'] = df1['k1'].map(df2.groupby('k2')['v2'].max())


什么强制将
k1
通过值映射到
k2
?看起来这依赖于排序,这符合简单的示例数据,但我不确定能否解决一般情况。@Gulzar这种方法不依赖于排序。熊猫在索引上对齐数据,
map
方法也是如此,因此从技术上讲,只有
k2
的匹配值映射到
k1
为了提高性能,我们可以在
groupby
调用
df1['k1'].map(df2.groupby('k2',sort=False)['v2'].max()中传递一个可选参数
sort=False
它可以工作,但我不明白为什么。
k1
k2
都不是索引。据我所知,这依赖于数据帧的索引的存在和匹配。我遗漏了什么?在这种情况下,我们可以做
df1['k1'].map(df2.set_index('k2')['v2])
,只需确保
df2
k2
列中不包含重复项。是什么强制
k1
通过值映射到
k2
?看起来这依赖于排序,这符合简单的示例数据,但我不确定能否解决一般情况。@Gulzar这种方法不依赖于排序。熊猫在索引上对齐数据,
map
方法也是如此,因此从技术上讲,只有
k2
的匹配值映射到
k1
为了提高性能,我们可以在
groupby
调用
df1['k1'].map(df2.groupby('k2',sort=False)['v2'].max()中传递一个可选参数
sort=False
它可以工作,但我不明白为什么。
k1
k2
都不是索引。据我所知,这依赖于数据帧的索引的存在和匹配。我遗漏了什么?在这种情况下,我们可以执行
df1['k1'].map(df2.set_index('k2')['v2])
,只需确保
df2
k2
列中不包含重复项即可。
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