2016-09-15 18 views
-1

我有一個數據幀,看起來像這樣的數字內容:標識包含特定字符串的細胞並覆蓋使用Python

enter image description here

我的目標是,以確定每列的每個單元格,如果下面的字符串包含:'KSS''ABC''DEF''ABC/DEF''KSS/DEF'

接着我想替換具有以下值的內容:'KSS' - > 100,'ABC' - > 200,'DEF' - > 300,'ABC/DEF' - > 400,'KSS/DEF' - > 500

輸出應該像這樣的:

enter image description here

注意:該算法應該是通用的和校驗每列,不僅數字3.爲了完整性,數據類型都是objects

到目前爲止,我的代碼行是這些,但我想他們是不完整的......

import pandas as pd 
import numpy as np 
df = pd.DataFrame([ 
     ['XYZ', 'BALSO', 'PISCO', 'KSS', 'Yes', 660, 'Cop'], 
     ['XYZ', 'TONTO', 'LOLLO', '195', 500, 'Yes', 'nan'], 
     ['XYZ', 'CALLO', 'WANDA', 'ABC/DEF', 'Yes', 500, 'nan'], 
     ['XYZ', 'AZUNGO', 'FINGI', 'KSS/DEF', 'Yes', 500, 'nan'] 
    ]) 
df = pd.read_csv('prova.csv', sep=',', skiprows=0, header=None, low_memory=False) 
df.str.replace('KSS|ABC|DEF','?') 
+0

在這裏,我們廢話downvoting .... –

+0

着呢,因爲沒有寫代碼......我從.csv文件加載的一切!這個問題對每個人都是明確的,圖像有助於讓人理解......如果你不喜歡它是好的,那不是我的問題,但我看到一些更好的人更關心這個問題,而不是抱怨兩個人圖片... –

+0

我認爲ayhan所說的是,你沒有發佈原始數據來重現你的df,如果你發佈了數據的文本,我們可以從剪貼板加載它並幫助你,但通過張貼圖像,你立即爲社區設置了一道屏障,幫助您。你應該考慮我們的觀點,如果你看到這個問題怎麼會試圖重現它?無論如何,如果你用你的查找值定義一個字典或系列,那麼你可以做'df ['3']。map(your_dict)',但是你需要過濾掉沒有匹配的行。 – EdChum

回答

3

如果您創建了您的查找和替換值的字典,那麼你可以在此列調用map,另外你需要通過na_action='ignore'map否則你得到的缺失值一個KeyError,另外你會注意到,當你有缺失值的數值轉換爲:float但可以使用astype(int)稍後再投:

In [182]: 
d={'KSS':100, 'ABC' :200, 'DEF' : 300, 'ABC/DEF' : 400, 'KSS/DEF' : 500} 
df[3] = df[3].map(d, na_action='ignore') 
df 

Out[182]: 
    0  1  2  3 4 5 
0 XYZ BALSO PISCO 100.00 660 Cop 
1 XYZ TONTO LOLLO nan 500 nan 
2 XYZ CALLO WANDA 400.00 500 nan 
3 XYZ AZUNGO FINGI 500.00 500 nan 

這裏我們投用astype類型:

In [178]: 
df[3] = df[3].astype(int) 
df 

Out[178]: 
    0  1  2 3 4 5 
0 XYZ BALSO PISCO 100 660 Cop 
1 XYZ TONTO LOLLO 195 500 nan 
2 XYZ CALLO WANDA 400 500 nan 
3 XYZ AZUNGO FINGI 500 500 nan 
+0

只能使用' .isin(d)'而不是在那裏調用它的'.keys()'方法... –

+0

@JonClements實際上它是毫無疑問的,因爲'map'採用'na_action'參數,所以如果你通過'na_action ='ignore''那麼它將不會bork和提高'KeyError' – EdChum

+0

哈哈......只是要提到 - 擊敗我:) –