2017-04-30 291 views
2

我有一個熊貓數據框,其中一列只包含字符串。基於另一列在熊貓數據框中創建列

df= pd.DataFrame(
    { 
    "A": [2,4,7,17,39], 
    "B": ["apple","apple","broccoli","rose","apple"] 
    } 
) 

我想檢查此列「B」並查找一個字符串包含某個單詞的某個部分的所有時間。然後我創建一個新的列「C」,其中包含一系列字符串,每當「app」在行中時都會顯示「fruit」,每當「ros」顯示時顯示爲「flower」,在「brocc」顯示時顯示蔬菜。

最後的數據幀的樣子:

df= pd.DataFrame(
    { 
    "A": [2,4,7,17,39], 
    "B": ["apple","apple","broccoli","rose","apple"], 
    "C": ["fruit","fruit", "vegetable", "flower", "fruit"] 
    } 
) 

回答

2

你可以使用字典作爲轉換器是get方法輸入apply

converter = {'apple': 'fruit', 
      'broccoli': 'veg', 
      'rose': 'flower'} 

df['C'] = df['B'].apply(converter.get) 
print(df) 
    A   B  C 
0 2  apple fruit 
1 4  apple fruit 
2 7 broccoli  veg 
3 17  rose flower 
4 39  apple fruit 

在部分匹配的情況下,你需要改變這一點點:

converter = {'app': 'fruit', 
      'brocc': 'vegetable', 
      'ros': 'flower'} 

df['C'] = df['B'].apply(lambda original: next(val for key, val in converter.items() if key in original)) 
print(df) 
    A   B   C 
0 2  apple  fruit 
1 4  apple  fruit 
2 7 broccoli vegetable 
3 17  rose  flower 
4 39  apple  fruit 

next(val for key, val in converter.items() if key in original)將爲您提供字典中第一個在「行」中找到的鍵的值。

3

創建字典

d = {'apple': 'fruit', 'broccoli': 'vegetable', 'rose': 'flower'} 

而且在使用它mapreplace(地圖是這個快):

df['B'].map(d) 
Out: 
0  fruit 
1  fruit 
2 vegetable 
3  flower 
4  fruit 
Name: B, dtype: object 

df['B'].replace(d) 
Out: 
0  fruit 
1  fruit 
2 vegetable 
3  flower 
4  fruit 
Name: B, dtype: object 
+0

我稍微改動過的問題,這樣的實體ISN」的全名t需要。這會改變你提供的答案嗎? – John

+0

@John你通常不應該以非平凡的方式改變問題(特別是如果你可以使答案無效)。改爲提出一個新問題。 – MSeifert

+0

@John不,這不適用於部分匹配。問題中的規則不是很清楚。這些單詞的部分是事先確定的嗎?例如,你將能夠像這樣構造一本字典嗎?或者你想使用這個字典,但是如果有部分匹配則返回一個值?對於後者,你需要澄清什麼樣的匹配是可以接受的。如果只有'o'會發生什麼?會是蔬菜還是花? – ayhan

相關問題