【问题标题】:Pandas dataframe count values for each column and sum in new indexPandas 数据帧每列的计数值和新索引中的总和
【发布时间】:2019-01-03 07:37:43
【问题描述】:

我有一些按性别划分的电话设备使用数据,我想在 pandas 中使用这些数据。

我需要计算这些值并使用这些计数创建一个新列。

这是df 数据的样子:

Sex     Apple   Samsung Huawei  Tecno
Male    Yes     Yes     No      No
Female  Yes     Yes     No      No
Female  Yes     Yes     No      No
Male    Yes     Yes     No      No
Male    No      Yes     No      No
Female  No      No      No      No
Female  Yes     Yes     No      No
Male    Yes     Yes     No      No
Male    Yes     Yes     No      No
Male    Yes     Yes     No      No
Female  Yes     Yes     No      No
Female  Yes     Yes     No      No
Female  Yes     Yes     No      No
Female  Yes     Yes     No      No
Female  No      Yes     No      No
Female  Yes     Yes     No      Yes
Male    Yes     Yes     No      No

这就是我想要的:

Sex     Response Apple  Samsung Huawei  Tecno
Male    Yes      6      7       0       0
        No       1      0       7       7
Female  Yes      8      9       0       1
        No       2      1       10      9

我绕着圈子试图让它工作,我的代码太乱了,我有点羞于发布它。我至少已经开始这样做了:

for name, group in df.groupby('Sex'):
    print(name)
    print(group)

我相信我可以通过groupbyunstack 的某种组合来实现这一点。另外,如果有人能找到关于多级数据分组的有价值的教程,我将不胜感激。

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    用途:

    df = (df.melt('Sex', value_name='Response')
           .groupby(['Sex', 'Response', 'variable'])
           .size()
           .unstack(fill_value=0)
           .rename_axis(None, axis=1))
    print (df)
                     Apple  Huawei  Samsung  Tecno
    Sex    Response                               
    Female No            2      10        1      9
           Yes           8       0        9      1
    Male   No            1       7        0      7
           Yes           6       0        7      0
    

    另一个类似的解决方案:

    df = (df.melt('Sex', value_name='Response')
           .groupby(['Sex', 'Response'])['variable']
           .value_counts()
           .unstack(fill_value=0)
           .rename_axis(None, axis=1))
    

    或者:

    df1 = df.melt('Sex', value_name='Response')
    df = pd.crosstab([df1['Sex'], df1['Response']], df1['variable']).rename_axis(None, axis=1)
    

    【讨论】:

    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2021-11-29
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多