pandas groupby group and subgroup level analysis

时间:2016-01-29 22:24:00

标签: python-2.7 pandas dataframe

在多列 groupby 对象上,如何仅访问外部列?对于例如下面,我可以通过:df.get_group(('media', 'entertainment content'))命令访问内部列(娱乐内容),我希望能够访问类似:df.get_group(('media'))但它会抛出错误:“ValueError:必须为具有多个分组键的get_group提供元组”

[('media', 'entertainment content'),('media', 'internet media')]

df.get_group(('media', 'entertainment content'))
                                     lasts      vol        prev ticker
industry sub_industry                                                 
media    entertainment content  379.200012  1828139  354.000000  suntv
         entertainment content  420.049988  2675741  404.600006      z

temp.get_group(('media'))
ValueError: must supply a tuple to get_group with multiple grouping keys

5 个答案:

答案 0 :(得分:2)

如果您只想访问“媒体”,则在致电get_group时不需要额外的括号。所以它只是get_group('media')

如果您想要检索多个组,那么您将使用一组额外的括号,这将创建元组。例如:get_group(('media','pizza'))

答案 1 :(得分:0)

只需执行错误消息所说的内容并使用元组:

temp.get_group(('media',))

请注意尾随逗号。

答案 2 :(得分:0)

我试图做类似的事情(为每个子组创建列)。但是,据我所知,下面的方法适合我,也会帮助你。我试图找到大熊猫文档提供的解决方案,但它没有帮助。我建议,这是方式,

grp = df.groupby('industry', 'sub_industry') values = []

for sub_ind in (df.sub_industry.unique()): values.append(grp.get_group(('media', sub_ind)))

答案 3 :(得分:0)

pandas.get_group一样,在按多个键分组后似乎无法访问单个键,我建议采用以下替代方法。

生成数据框:

import pandas as pd
import numpy as np

rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 12,
               'B': rand.randn(24),
               'C': rand.randint(0, 20, 24),
               'D': ['aaa','bbb','ccc'] * 8})

通过多个键(“ A”和“ D”)分组,并使用pandas.ngroup分配组号,并将其存储在新列中:

df["grouping_AandD"] = df.groupby(["A", "D"]).ngroup()

使用刚创建的列在循环中显示所有组合,但仅显示包含“需要的键”(在这种情况下为“ foo”)的组合:

wanted_key = "foo"
for i in range(0, df.grouping_AandD.nunique()):
    grouped_df = df[df.grouping_AandD == i]
    if (grouped_df.A.all() == wanted_key):
        print(grouped_df)

答案 4 :(得分:0)

您的代码不起作用的原因是因为您创建了一个具有多个键的组,但是在调用 get_group 方法时,您只使用了一个键(行业),即“媒体”。 @Cashe Staheli 在第二个选项中提到你需要做的事情如下

get_group(('value1','value2'))