我有一個df
review review_id word_count
['abc def', 'ghi'] [1, 2] [2, 1]
['jkl mno pqr', 'stu', 'vwx'] [3, 4, 5] [3, 1, 1]
對于 df 中的每一行,我想為 review 和 review_id 創建新列,其中僅包含具有最大字數的 review/review_id。因此,輸出應該看起來像這樣。
review review_id
abc def 1
jkl mno pqr 3
我只能想到在word_count中獲取最大值的索引。任何建議都將受到歡迎。謝謝!
uj5u.com熱心網友回復:
DataFrame.explode與比較每組(來自行)的最大值一起使用,并boolean indexing在需要所有最大值時選擇行:
df = df.explode(['review','review_id','word_count'])
#for oldier pandas versions
#df = df.apply(lambda x: x.explode())
df = df[df['word_count'].eq(df.groupby(level=0)['word_count'].transform('max'))]
print (df)
review review_id word_count
0 abc def 1 2
1 jkl mno pqr 3 3
uj5u.com熱心網友回復:
為了提高效率,您可以使用串列推導和 DataFrame 建構式。這將比使用快至少一個數量級explode:
import numpy as np
df2 = pd.DataFrame([(a[(m:=np.argmax(x))], b[m]) for a,b,x in
zip(df['review'], df['review_id'], df['word_count'])],
index=df.index, columns=['review', 'review_id']
)
print(df2)
輸出:
review review_id
0 abc def 1
1 jkl mno pqr 3
如果你想要所有列:
df2 = pd.DataFrame([(a[(m:=np.argmax(x))], b[m], x[m]) for a,b,x in
zip(df['review'], df['review_id'], df['word_count'])],
index=df.index, columns=df.columns
)
輸出:
review review_id word_count
0 abc def 1 2
1 jkl mno pqr 3 3
定時
在 20k 行上
# list comprehension
50.2 ms ± 1.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# explode groupby
1.22 s ± 10 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/493219.html
上一篇:使用集合和資料框計算唯一單詞
