我有一個資料框,其中有一列串列和一列包含該串列中物件的數量,并按其降序排序。例如:
df=pd.DataFrame({'value':[['AB','BC','CD','DE','EF','FG','GH','HI'],
['BC','CD','DE','IJ','JK','KL','LM'],
['AB','CD','DE','MN'],
['C', 'D', 'M'],
['MN','NO'],
['APQ']],
'no_of_values': [8,7,4,3,2,1]})
我想要第三列,其中包含第一次出現的值的數量(從上到下)。例如:
df_goal=pd.DataFrame({'value':[['AB','BC','CD','DE','EF','FG','GH','HI'],
['BC','CD','DE','IJ','JK','KL','LM'],
['AB','CD','DE','MN'],
['C', 'D', 'M'],
['MN','NO'],
['APQ']],
'no_of_values': [8,7,4,3,2,1],
'no_of_1st_occurence': [8,4,1,3,1,1]})
我的方法是遍歷 'value' 列的每一行,并將尚未包含的每個值添加到 'non_redundant_list' 中。如果該字母還不是其中的一部分,則“no_of_1st_occurence”列也應在相應行中變為 1。我嘗試如下:
df['no_of_1st_occurence'] = 0
non_redundant_list = []
for index in df.index:
for list in df['value'][index]:
for value in list:
if not value in non_redundant_list:
non_redundant_list.append(value)
df['no_of_1st_occurence'][index] = 1
然而,這不知何故只檢查每個字母的第一次出現,而不是串列中的物件。我必須如何調整我的代碼才能作業,還是有更簡單的解決方案?
uj5u.com熱心網友回復:
您可以使用以下方式以更有效的方式進行操作explode:
df['no_of_1st_occurence'] = (~df['value'].explode().duplicated()).groupby(level=0).sum()
輸出:
>>> df
value no_of_values no_of_1st_occurence
0 [AB, BC, CD, DE, EF, FG, GH, HI] 8 8
1 [BC, CD, DE, IJ, JK, KL, LM] 7 4
2 [AB, CD, DE, MN] 4 1
3 [C, D, M] 3 3
4 [MN, NO] 2 1
5 [APQ] 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/444458.html
