我正在尝试创建一个创建数据透视表的函数,我需要根据字符串过滤一列。
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'错误。是否有不同的方法在函数中进行通配符搜索?
答案 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