在 python 中,我有一個如下所示的資料框:
Column1 Column2
[a,b,c,d] 4
[a,f,g] 3
[b,c] 6
[a,c,d] 5
我想計算第三列,每當其中一個專案出現在 Column1 中時,它就會添加 Column2 中的值(例如,在第一行中,它將是 a=4 3 5, b=4 6, c=5 6 5, d=4 5,所以總共有 4 3 5 4 6 5 6 5 4 5=47):
Column1 Column2 Column3
[a,b,c,d] 4 47
[a,f,g] 3 21
[b,c] 6 26
[a,c,d] 5 37
我已盡力進行查詢和索引編制,但沒有成功,在此先感謝您!
uj5u.com熱心網友回復:
嘗試使用explode,然后創建映射字典并groupby回傳
s = df.explode('Column1')
d = s.groupby('Column1')['Column2'].sum()
s['new'] = s['Column1'].map(d)
out = s.groupby(level=0).agg({'Column1':list,'Column2':'first','new':'sum'})
out
Column1 Column2 new
0 [a, b, c, d] 4 46
1 [a, f, g] 3 18
2 [b, c] 6 25
3 [a, c, d] 5 36
注意 :
c = 4 6 5
uj5u.com熱心網友回復:
df = pd.DataFrame({'Column1': [['a', 'b', 'c', 'd'], ['a', 'f', 'g'], ['b', 'c'], ['a', 'c', 'd']],
'Column2': [4, 3, 6, 5]})
df1 = df.explode('Column1')
df['Column3'] = df1.groupby(level=0).apply(
lambda d: d.Column1.apply(lambda x: df1.loc[df1.Column1 == x, 'Column2'].sum()).sum())
print(df)
Column1 Column2 Column3
0 [a, b, c, d] 4 46
1 [a, f, g] 3 18
2 [b, c] 6 25
3 [a, c, d] 5 36
uj5u.com熱心網友回復:
讓我們從更容易理解的版本開始,一步一步。
爆炸第 1列:
wrk = df.explode(column='Column1')結果是:
Column1 Column2 0 a 4 0 b 4 0 c 4 0 d 4 1 a 3 1 f 3 1 g 3 2 b 6 2 c 6 3 a 5 3 c 5 3 d 5計算Column1 中串列中每個元素的權重:
weight = wrk.groupby('Column1').sum().rename(columns={'Column2': 'Weight'})結果是:
Weight Column1 a 12 b 10 c 15 d 9 f 3 g 3請注意您的計數的一些差異,例如c 的權重 是4 6 5 = 15。
加入列1從WRK與重量:
wrk2 = wrk[['Column1']].join(weight, on='Column1')結果是:
Column1 Weight 0 a 12 0 b 10 0 c 15 0 d 9 1 a 12 1 f 3 1 g 3 2 b 10 2 c 15 3 a 12 3 c 15 3 d 9最后一步是計算新列:
df['Column3'] = wrk2.groupby(level=0).Weight.sum()結果是:
Column1 Column2 Column3 0 [a, b, c, d] 4 46 1 [a, f, g] 3 18 2 [b, c] 6 25 3 [a, c, d] 5 36
但是如果你想要更簡潔的代碼,你可以將上面的解決方案“壓縮”為:
wrk = df.explode(column='Column1')
df['Column3'] = wrk[['Column1']].join(wrk.groupby('Column1').sum().rename(
columns={'Column2': 'Weight'}), on='Column1').groupby(level=0).Weight.sum()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367994.html
下一篇:在numpy中使用條件取上一行
