簡體   English   中英

基於字典和 str.contains() 的新 dataframe 列

[英]new dataframe column based on dictionary and str.contains()

我想創建一個新的 dataframe dfnew_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.

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