【问题标题】:Create multiple columns with Pandas .apply()使用 Pandas .apply() 创建多列
【发布时间】: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 不会出现多次。

Desired DataFrame

【问题讨论】:

  • 请向我们展示所需输出的样本
  • 您好,欢迎您。如果您可以查看How to Ask,然后尝试生成minimal reproducible example,那就太好了。
  • 谢谢,克里斯。我已经通过编辑添加了它。希望我能说得更清楚。
  • 加个df2的样本会更好。
  • 谢谢,@rpanai!我什至难以描述问题所在。但再次感谢您抽出宝贵时间回答。

标签: python pandas dataframe multiple-columns


【解决方案1】:

IIUC,您想选择具有加权概率的同一类别的随机 ID。为此,您可以构建一个辅助数据框 (dfg) 并使用 apply:

df2 = pd.DataFrame({
    'id': np.random.randint(1, 12, size=11),
    'category': ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'c']})

dfg = df.groupby('category').agg(list)

df3 = df2.join(df2['category']
               .apply(lambda r: pd.Series(np.random.choice(dfg.loc[r, 'id'],
                                                           p=dfg.loc[r, 'p'],
                                                           size=3)))
               .add_prefix('id_')
               )

输出:

    id category  id_0  id_1  id_2
0   11        a     2     3     3
1   10        a     2     3     1
2    4        a     1     2     3
3    7        a     2     1     4
4    5        b     6     5     5
5   10        b     6     5     6
6    8        c     9     8     8
7   11        c     7     8     7
8   11        c    10     8     8
9    4        c     9    10    10
10   1        c    11    11     9

【讨论】:

  • 你做到了,而且成功了。说真的,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2014-06-28
  • 2022-01-01
  • 2017-04-16
相关资源
最近更新 更多