pandas - groupby by partial string

时间:2015-02-13 09:06:11

标签: python string pandas

我想通过部分子字符串对DataFrame进行分组。这是一个示例.csv文件:

GridCode,Key
1000,Colour
1000,Colours
1001,Behaviours
1001,Behaviour
1002,Favourite
1003,COLORS
1004,Honours

我到目前为止所做的是将文件导入为df = pd.read_csv(sample.csv),然后我将所有字符串放入带df['Key'] = df['Key'].str.lower()的小写字母。我尝试的第一件事是由GridCode和Key with:

组成的groupby
g = df.groupby([df['GridCode'],df['Key']]).size()

然后取消堆积并填写:

d = g.unstack().fillna(0)

,生成的DataFrame为:

Key       behaviour  behaviours  colors  colour  colours  favourite  honours
GridCode                                                                    
1000              0           0       0       1        1          0        0
1001              1           1       0       0        0          0        0
1002              0           0       0       0        0          1        0
1003              0           0       1       0        0          0        0
1004              0           0       0       0        0          0        1

现在我想做的是只对包含子字符串'my'的字符串进行分组,在这种情况下只避免使用颜色Key,创建一个带有所需子字符串的新列。 预期结果如下:

Key       'our'
GridCode                                                                    
1000        2              
1001        2
1002        1
1003        0
1004        1

我还尝试使用masked = df['Key'].str.contains('our'),然后df1 = df[mask]屏蔽DataFrame,但我无法弄清楚如何使用新的groupby计数创建新列。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

>>> import re  # for the re.IGNORECASE flag
>>> df['Key'].str.contains('our', re.IGNORECASE).groupby(df['GridCode']).sum()
GridCode
1000        2
1001        2
1002        1
1003        0
1004        1
Name: Key, dtype: float64

也是,而不是

df.groupby([df['GridCode'],df['Key']])

最好这样做:

df.groupby(['GridCode', 'Key'])