【问题标题】:pandas groupby group and subgroup level analysispandas groupby 组和子组级别分析
【发布时间】:2016-05-07 19:32:41
【问题描述】:

在多列 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

【问题讨论】:

    标签: python-2.7 pandas dataframe


    【解决方案1】:

    按照错误消息中的说明操作并使用元组:

    temp.get_group(('media',))
    

    注意结尾的逗号。

    【讨论】:

    • 嗨。我试过了,它给了我以下错误 temp.get_group(('media',)) ValueError: must supply a same-length tuple to get_group with multiple grouping keys
    • OP 的问题不是他/她没有尝试使用元组,而是他/她没有认识到(x) 不是 Python 中的元组,而(x,) 是。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        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)
        

        【讨论】:

          【解决方案5】:

          您的代码不起作用的原因是因为您创建了一个包含多个键的组,但是在调用 get_group 方法时您只使用了一个键(行业),即“媒体”。 @Cash Staheli 在第二个选项中提到您需要执行以下操作

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

          【讨论】:

            猜你喜欢
            • 2019-09-28
            • 2021-01-28
            • 2019-06-08
            • 2019-08-05
            • 1970-01-01
            • 1970-01-01
            • 2015-08-03
            • 1970-01-01
            • 2017-07-10
            相关资源
            最近更新 更多