【问题标题】:Listing unique value counts per groups in pandas dataframe列出熊猫数据框中每组的唯一值计数
【发布时间】:2019-12-31 09:37:55
【问题描述】:

我是 pandas 和 python 的新手。

我正在尝试按一列对项目进行分组,并列出每组数据框中的信息。

我的数据框:

        B          C        D          E              F
1       Honda      USA      2000       Washington     New
2       Honda      USA      2001       Salt Lake      Used
3       Ford       Canada   2005       Washington     New
4       Toyota     USA      2010       Ney York       Used
5       Honda      USA      2001       Salt Lake      Used
6       Honda      Canada   2011       Salt Lake      Crashed
7       Ford       Italy    2014       Rome           New

我正在尝试按B 列对我的数据框进行分组,并列出B 组中有多少CDEF 列值。例如,我们看到在B 列中有 4 个Honda,我将它们组合在一起。然后我想列出以下信息 - USA(3), Canada(1), 2000(1),2001(2), 2011(1), Washington(1), Salt Lake(3), New(1), Used(2), Crashed(1) 并在 B 列中为每个组(汽车制造商)做同样的事情:

        Car         Country        Year        City             Condition
1       Honda(4)    USA(3)         2000(1)     Washington(1)    New(1)
                    Canada(1)      2001(2)     Salt Lake(3)     Used(2)
                                   2011(1)                      Crashed(1)

2       Ford(2)     Canada(1)      2005(5)     Washington(1)    New(2)
                    Italy(1)       2014(1)     Rome(1)

...

到目前为止我已经尝试过:

df.groupby(['B'])

这让我回了<pandas.core.groupby.generic.DataFrameGroupBy object at 0x11d559080>

在这一点上,我不确定在对B 列分组后如何继续编写代码以获得所需的结果。

感谢您的建议。

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    您需要带有自定义函数的 lambda 函数,以便使用 Series.value_counts 分别处理每一列,然后将索引值与 Series 的计数值连接在一起:

    def f(x):
        x = x.value_counts()
        y = x.index.astype(str) + '(' + x.astype(str) + ')'
        return y.reset_index(drop=True)
    df1 = df.groupby(['B']).apply(lambda x: x.apply(f)).reset_index(drop=True)
    print (df1)
               B          C        D              E           F
    0    Ford(2)   Italy(1)  2014(1)  Washington(1)      New(2)
    1        NaN  Canada(1)  2005(1)        Rome(1)         NaN
    2   Honda(4)     USA(3)  2001(2)   Salt Lake(3)     Used(2)
    3        NaN  Canada(1)  2011(1)  Washington(1)  Crashed(1)
    4        NaN        NaN  2000(1)            NaN      New(1)
    5  Toyota(1)     USA(1)  2010(1)    Ney York(1)     Used(1)
    

    【讨论】:

    • 一如既往地@jezrael,谢谢!不知道我是否应该问另一个问题,或者这是问的正确地方 - 如果我想按国家和年份分组,这样C 将有 3 个值的 USACanada 有 1 个值的 @ 987654328@入口?
    • @JonasPalačionis - 我认为您只需将 df.groupby(['B']) 更改为 df.groupby(['B', 'C'])
    • 你知道为什么当我尝试按Year 分组时不会得到相同的数据帧结构吗?我没有得到按年份分组的相同视图,我得到 Years 按预期列出,但 Car model 被简单地列为 most_common 值?
    • @JonasPalačionis - 不确定是否理解,它与Honda(some number) 不同?
    • 我会用propper数据集发布另一个问题,这样会更有意义。
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2016-05-18
    • 2018-06-10
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多