我正在嘗試學習 pandas 和 python 以將一些問題從 excel 轉移到 pandas/python。我的銀行有一個很大的 csv 檔案,里面有超過 10000 條記錄。我想根據描述對記錄進行分類。為此,我有一個帶有關鍵字的大映射檔案。在 excel 中,我使用了 vLookup,我正在嘗試將此解決方案匯入 Pandas/python
所以我可以將 csv 讀入資料幀 dfMain。一列(在 dfMain 中)的文本稱為 description 是我的輸入,用于根據名為 dfMap 的映射檔案對其進行分類。
dfMain 看起來像這樣簡化了:
Datum Bedrag Description
2020-01-01 -166.47 een cirkel voor je uit
2020-01-02 -171.79 even een borreling
2020-01-02 -16.52 stilte zacht geluid
2020-01-02 -62.88 een steentje in het water
2020-01-02 -30.32 gooi jij je zorgen weg
2020-01-02 -45.99 dan ben je laf weet je dat
2020-01-02 -322.44 je klaagt ook altijd over pech
2020-01-03 -4.80 jij kan niet ophouden zorgen
2020-01-07 5.00 de wereld te besnauwen
dfMap 看起來像這樣簡化
sleutel code
0 borreling A1
1 zorgen B2
2 steentje C2
3 een C1
dfMap 包含關鍵字('sleutel')和一個類別代碼('code')。
當 'sleutel' 是 dfMain 中 'description' 的子字串時,dfMain 中名為 'category' 的額外要添加的列將獲得代碼的值。我知道多個關鍵字可以應用于某些描述值,但首先是計數,換句話說:dfMain 中的行數必須保持不變。
生成的資料框必須如下所示:
Out[34]:
Datum Bedrag Description category
2020-01-01 -166.47 een cirkel voor je uit C1
2020-01-02 -171.79 even een borreling A1
2020-01-02 -16.52 stilte zacht geluid NaN
2020-01-02 -62.88 een steentje in het water C2
2020-01-02 -30.32 gooi jij je zorgen weg B2
2020-01-02 -45.99 dan ben je laf weet je dat NaN
2020-01-02 -322.44 je klaagt ook altijd over pech NaN
2020-01-03 -4.80 jij kan niet ophouden zorgen B2
2020-01-07 5.00 de wereld te besnauwen NaN
我用 join 嘗試了很多東西,但無法讓它作業。
uj5u.com熱心網友回復:
一個有效的解決方案是使用正則運算式,extract然后map使用結果:
regex = '(%s)' % dfMap['sleutel'].str.cat(sep='|')
dfMain['category'] = (
dfMain['Description']
.str.extract(regex, expand=False)
.map(dfMap.set_index('sleutel')['code'])
)
輸出:
Datum Bedrag Description category
0 2020-01-01 -166.47 een cirkel voor je uit C1
1 2020-01-02 -171.79 even een borreling C1
2 2020-01-02 -16.52 stilte zacht geluid NaN
3 2020-01-02 -62.88 een steentje in het water C1
4 2020-01-02 -30.32 gooi jij je zorgen weg B2
5 2020-01-02 -45.99 dan ben je laf weet je dat NaN
6 2020-01-02 -322.44 je klaagt ook altijd over pech NaN
7 2020-01-03 -4.80 jij kan niet ophouden zorgen B2
8 2020-01-07 5.00 de wereld te besnauwen NaN
生成的正則運算式將最終為 '(borreling|zorgen|steentje|een)'
uj5u.com熱心網友回復:
試試這個:
import pandas as pd
# prepare the data
Datum = ['2020-01-01', '2020-01-02', '2020-01-02', '2020-01-02', '2020-01-02', '2020-01-02', '2020-01-02', '2020-01-03', '2020-01-03']
Bedrag = [-166.47, -171.79, -16.52, -62.88, -30.32, -45.99, -322.44, -4.80, 5.00]
Description = ["een cirkel voor je uit", "even een borreling", "stilte zacht geluid", "een steentje in het water",
"gooi jij je zorgen weg", "dan ben je laf weet je dat", "je klaagt ook altijd over pech", "jij kan niet ophouden zorgen", "de wereld te besnauwen"]
dfMain = pd.DataFrame(Datum, columns=['Datum'])
dfMain['Bedrag'] = Bedrag
dfMain['Description'] = Description
sleutel = ["borreling", "zorgen", "steentje", "een"]
code = ["A1", "B2", "C2", "C1"]
dfMap = pd.DataFrame(sleutel, columns=['sleutel'])
dfMap['code'] = code
print(dfMap)
# solution
map_code = pd.Series(dfMap.code.values ,index=dfMap.sleutel).to_dict()
def extract_codes(row):
for item in map_code:
if item in row:
return map_code[item]
return "NaN"
dfMain['category'] = dfMain['Description'].apply(extract_codes)
print(dfMain)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400825.html
下一篇:如何比較熊貓資料框的列?
