2017-04-15 68 views
0

我有一個數據框,其中列'a'是兒童列表和列'b',它是每個孩子的玩具數量根據另一列中的字符串段選擇大熊貓數據幀的列中的數據

dic = { 'a': [ 'pippo', 'giovanni', 'giacomo', 'giovanni', 'giovanni', 'pippo'],\ 
      'b': [ 3, 5, 1, 10, 7, 8]} 
df = pd.DataFrame(dic) 

數據幀是

a   b 
0 pippo  3 
1 giovanni 5 
2 giacomo  1 
3 giovanni 10 
4 giovanni 7 
5 pippo  8 

在這種情況下,一些孩子正在repeted在數據幀,如果我想知道有多少玩具有喬萬尼,比我只是寫這

df['b'][ df['a'] == 'giovanni' ] 


1 5 
3 10 
4 7 

第二列數字的總和是喬瓦尼所擁有的玩具數量(5 + 10 + 7 = 22)。

但是,如果他的名字的最後兩個字母沒有正確書寫,我怎麼才能算出喬瓦尼所擁有的玩具的數量?這裏的情況

dic = { 'a': [ 'pippo', 'giovanLi', 'giacomo', 'giovanNi', 'giovanMi', 'pippo'],\ 
      'b': [ 3, 5, 1, 10, 7, 8]} 
df = pd.DataFrame(dic) 

數據幀是

a   b 
0 pippo  3 
1 giovanLi 5 
2 giacomo  1 
3 giovanNi 10 
4 giovanMi 7 
5 pippo  8 

,我想這樣的事情

df['b'][ df['a'][:-2] == 'giovan' ] 

,從一個事實,即在B列有一個選擇玩具的所有號碼以'giovan'開頭的字符串。

你對我有什麼建議?

回答

1

這裏有兩種選擇:

df.loc[df['a'].str.startswith('giovan'), 'b'].sum() 
Out: 22 

df.groupby(df['a'].str[:-2])['b'].sum() 
Out: 
a 
giaco  1 
giovan 22 
pip  11 
Name: b, dtype: int64 

第一個使用的startswith方法。第二個名字列由第一個n-2字符組成。一般來說,您需要str訪問器來執行這些操作。如果您嘗試df['b'][df['a'].str[:-2] == 'giovan'],您的方法可能會奏效。這被稱爲鏈接索引,但我建議使用.loc

0

您可能希望考慮更廣泛一些,並完全刪除不區分大小寫,並允許在任何類型的子字符串之間進行匹配,而不是從末尾丟失只有2個字符。下面應該做你以後的事情,並且要更加包容一些,以彌補數據中的不準確性。

df[df['a'].str.contains('giovanni', flags=re.IGNORECASE)]['b'].sum() 

它通過檢查要識別與區分大小寫的特性的子創建了一個布爾值的選擇,那麼它讓你有一個系列,你可以再總結的結果只返回了「B」柱。

相關問題