在函数中使用.filter

时间:2018-06-15 01:48:52

标签: python pandas

我正在尝试创建一个创建数据透视表的函数,我需要根据字符串过滤一列。

df = DataFrame({'Breed': ['Sheltie', 'Bernard', 'Husky', 'Husky', 'pig', 'Sheltie','Bernard'], 
            'Metric': ['One month walked', 'two month walked', 'three month walked', 'four month walked', 'one month waiting', 'two month waiting', 'Three month waiting'],
            'Age': [1,2,3,4,5,6,7]})

我想要一个数据透视表,其中包括所有狗的年龄总结,他们有一个“已完成”的指标,无论哪个月。

看起来有点像这样:

                             Age
Breed      Metric            sum
------------------------------------
Husky  one month walked       4
Husky  four month walked      5

该功能会过滤掉任何未“走过”的指标,同时总结每个“已完成”指标。

到目前为止我一直在尝试这个。

import pandas as pd
import fnmatch

def Dog_Walked_Completed(dfprime):
    return dfprime[dfprime['Breed'] == 'Husky'].groupby(['Breed','Metric']).fnmatch.filter(lambda df : (df['Metric']=='?completion')).any().agg({'Age': ['sum']})

但每当我尝试时,我得到一个''DataFrameGroupBy'对象没有属性'fnmatch'错误。是否有不同的方法在函数中进行通配符搜索?

1 个答案:

答案 0 :(得分:1)

假设想要找到每个品种的年龄总和,其指标中的完成词。您可以采取以下方法。

>>> import pandas as pd
>>> df = pd.DataFrame({'Breed': ['Sheltie', 'Bernard', 'Husky', 'Husky', 'pig', 'Sheltie','Bernard'],'Metric': ['One month walked', 'two month walked', 'three month walked', 'four month walked', 'one month waiting', 'two month waiting', 'Three month waiting'],'Age': [1,2,3,4,5,6,7]})
>>> df
   Age    Breed               Metric
0    1  Sheltie     One month walked
1    2  Bernard     two month walked
2    3    Husky   three month walked
3    4    Husky    four month walked
4    5      pig    one month waiting
5    6  Sheltie    two month waiting
6    7  Bernard  Three month waiting

现在让我们创建一个布尔函数,用于在数据框Metrics的{​​{1}}列中检查单词的完成情况。

df

现在,您可以对品种和>>> bool = df['Metric'].str.contains('completion') 变量groupby进行查找年龄总和。

bool

由于没有完成'示例数据中的单词,都返回false。但是我们可以检查一下“走路”'因为有一些行走在哪里。

>>> pvt_tbl = df.groupby(['Breed',bool])['Age'].sum()
>>> pvt_tbl
Breed    Metric
Bernard  False     9
Husky    False     7
Sheltie  False     7
pig      False     5
Name: Age, dtype: int64

希望,这就是你想要做的。

<强>更新 根据评论:

>>> bool1 = df['Metric'].str.contains('walked')
>>> pvt_tbl1 = df.groupby(['Breed',bool1])['Age'].sum()
>>> pvt_tbl1
Breed    Metric
Bernard  False     7
         True      2
Husky    True      7
Sheltie  False     6
         True      1
pig      False     5
Name: Age, dtype: int64