【发布时间】:2021-10-14 00:34:17
【问题描述】:
我有两个 pandas DataFrame,它们都包含相同的类别但不同的“id”列。为了说明,第一个表如下所示:
df = pd.DataFrame({
'id': list(np.arange(1, 12)),
'category': ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'c'],
'weight': list(np.random.randint(1, 5, 11))
})
df['weight_sum'] = df.groupby('category')['weight'].transform('sum')
df['p'] = df['weight'] / df['weight_sum']
Output:
id category weight weight_sum p
0 1 a 4 14 0.285714
1 2 a 4 14 0.285714
2 3 a 2 14 0.142857
3 4 a 4 14 0.285714
4 5 b 4 8 0.500000
5 6 b 4 8 0.500000
6 7 c 3 15 0.200000
7 8 c 4 15 0.266667
8 9 c 2 15 0.133333
9 10 c 4 15 0.266667
10 11 c 2 15 0.133333
第二个只包含'id'和'category'。
我要做的是创建一个第三个数据帧,它将继承第二个数据帧的id,加上第一个数据帧的ids 的三个新列- 应根据p 列选择每个,这表示其在该类别中的权重。
我尝试了多种解决方案,并正在考虑应用 np.random.choice 和 .apply(),但无法找到实现该功能的方法。
编辑:
所需的输出类似于:
user_id id_1 id_2 id_3
0 2 3 1 2
1 3 2 2 3
2 4 1 3 1
每个id 是根据其概率和各自的category 选择的(两个DataFrame 都有此列),并且相同的user_id 不会出现多次。
【问题讨论】:
-
请向我们展示所需输出的样本
-
您好,欢迎您。如果您可以查看How to Ask,然后尝试生成minimal reproducible example,那就太好了。
-
谢谢,克里斯。我已经通过编辑添加了它。希望我能说得更清楚。
-
加个
df2的样本会更好。 -
谢谢,@rpanai!我什至难以描述问题所在。但再次感谢您抽出宝贵时间回答。
标签: python pandas dataframe multiple-columns