簡體   English   中英

使用 Pandas .apply() 創建多列

[英]Create multiple columns with Pandas .apply()

我有兩個 Pandas DataFrames,它們都包含相同的類別但不同的“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”。

我想要做的是創建第三個 DataFrame ,它會繼承第二個 DataFrame 的id ,加上第一個 DataFrame 的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 (兩個 DataFrames 都有此列)被選擇,並且對於同一個user_id不會出現多次。

所需的數據幀

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM