我有一个数据框,其中"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
在这种情况下,一些孩子在数据帧上重复,如果我想知道有多少玩具有乔瓦尼,那么我只需要写这个
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"列,因此您有一个序列,然后您可以对其结果求和。