Pandas:groupby()一步完成不同列

x8goxv8g  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(94)

我有一个如下的数据框。“feature1”,“feature2”和“feature3”是独立的特征。这些特征中的可能值仅为1,2,3,4。我需要找到大小,按每个特征的值分组。下面显示的是我现在是如何做的,分别为每个特征。有没有一种方法可以在一个步骤或更优化的方式中完成它?谢谢。

import pandas as pd
df = pd.DataFrame({'State'    : ['AZ', 'FL', 'AZ', 'FL', 'FL', 'FL', 'AZ', 'FL', 'AZ', 'AZ', 'FL', 'AZ', 'FL', 'AZ', 'AZ'],
               'feature1' : [1, 3, 2, 2, 4, 3, 3, 1, 2, 4, 3, 1, 1, 1, 1],
               'feature2' : [1, 2, 1, 2, 3, 2, 4, 1, 2, 4, 3, 1, 1, 1, 1],
               'feature3' : [1, 4, 1, 2, 1, 4, 3, 3, 2, 4, 3, 1, 1, 1, 1],})
(
    df
    .groupby(['State', 'feature1'])
    ['feature1']
    .size()
    .to_frame('N')
 )

feature1的输出:

sr4lhrrt

sr4lhrrt1#

选项1:melt + value_counts
df.melt('State', var_name='feature').value_counts().sort_index()

结果

State  feature   value
AZ     feature1  1        4
                 2        2
                 3        1
                 4        1
       feature2  1        5
                 2        1
                 4        2
       feature3  1        5
                 2        1
                 3        1
                 4        1
FL     feature1  1        2
                 2        1
                 3        3
                 4        1
       feature2  1        2
                 2        3
                 3        2
       feature3  1        2
                 2        1
                 3        2
                 4        2
dtype: int64
选项2:melt + crosstab
s = df.melt('State', var_name='feature')
pd.crosstab(s['State'], [s['feature'], s['value']])

结果

feature        feature1          feature2          feature3         
value          1  2  3  4        1  2  3  4        1  2  3  4
State                                                        
AZ             4  2  1  1        5  1  0  2        5  1  1  1
FL             2  1  3  1        2  3  2  0        2  1  2  2

相关问题