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