根据另一列中的字符串段选择大熊猫数据帧的列中的数据

问题描述:

我有一个数据框,其中列'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'开头的字符串。

你对我有什么建议?

这里有两种选择:

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

您可能希望考虑更广泛一些,并完全删除不区分大小写,并允许在任何类型的子字符串之间进行匹配,而不是从末尾丢失只有2个字符。下面应该做你以后的事情,并且要更加包容一些,以弥补数据中的不准确性。

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

它通过检查要识别与区分大小写的特性的子创建了一个布尔值的选择,那么它让你有一个系列,你可以再总结的结果只返回了“B”柱。