[英]new dataframe column based on dictionary and str.contains()
我想創建一個新的 dataframe df
列new_col
,如果某些特定列col_1
包含字典值v
內的某些字符串(使用正則表達式字符 + join() ),則放置字典my_dict
的鍵值k
。
我通過迭代字典並制作連續的 boolean 過濾器正確地做到了這一點。 但我想要一個更優雅的解決方案。 這是我的開始,但不正確:
df['new_col'] = [k for k,v in my_dict.items() for x in df['col_1'].values if x.str.contains('|'.join(v))]
似乎該錯誤是由於 dataframe 和字典的長度不同造成的。
按要求編輯:
df = pd.DataFrame({'col_1':['Some Transfer', 'Some Deposit', 'Some Dividend', 'Adj Shares Fee']})
col_1
0 Some Transfer
1 Some Deposit
2 Some Dividend
3 Adj Shares Fee
my_dict = {'transfer':['Transfer', 'Deposit'],'dividend':['Dividend'],'shares fee':['Adj Shares']}
df['new_col'] = df['col_1'].apply(lambda x: "|".join((k for (k,v) in my_dict.items() if v in x)))
TypeError: 'in <string>' requires string as left operand, not list
str.contains()
與正則表達式一起使用,但它適用於按列操作。 您需要通過字典的所有值 go 。 我不知道是否有一個簡單的方法來使用它,也許是這樣的:
mx = [df.col_1.str.contains('|'.join(v)) for v in my_dict.values()]
df['new_col'] = np.array(list(my_dict.keys()))[np.argmax(mx,axis=0)]
另一種方法是使用re
並調整您擁有的代碼:
import re
df['new_col'] = df.col_1.apply(lambda x:[k for k,v in my_dict.items() if re.search('|'.join(v),x)][0])
col_1 new_col
0 Some Transfer transfer
1 Some Deposit transfer
2 Some Dividend dividend
3 Adj Shares Fee shares fee
您可以在列上使用.apply()
:
df = pd.DataFrame({'col_1':['Some Transfer', 'Some Deposit', 'Some Dividend', 'Adj Shares Fee']})
my_dict = {'transfer':['Transfer', 'Deposit'],'dividend':['Dividend'],'shares fee':['Adj Shares']}
所以,因為你的字典有一個每個鍵的條目列表,處理它的一種方法是反轉字典,以便類別是值:
new_dict = {}
for key,val in my_dict.items():
for v in val:
new_dict[v] = key
然后我發布的原始結構將起作用:
df['new_col'] = df['col_1'].apply(lambda x: "|".join( (v for (k,v) in new_dict.items() if k in x) ) )
另外,如果您想更加靈活並處理忽略大小寫的問題,您可以使用re
庫作為替代方案:
import re
df['new_col'] = df['col_1'].apply(lambda x: "|".join( (v for (k,v) in new_dict.items() if re.search(k, x, flags=re.IGNORECASE) ) ) )
print(df)
col_1 new_col
0 Some Transfer transfer
1 Some Deposit transfer
2 Some Dividend dividend
3 Adj Shares Fee shares fee
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.