【问题标题】:Python Pandas Dataframe: replace variable by the frequency countPython Pandas Dataframe:用频率计数替换变量
【发布时间】:2016-04-04 18:19:29
【问题描述】:

我有一个数据框,其中包含具有数百个不同值的分类变量。

我可以使用 groupby 语句 + reset_index() 的“values_count()”函数验证这些级别的频率...

我试图用它们的频率计数替换这数百个值(后来在低基数的合并级别上)。我试图加入两个不同的数据框(一个带有值,另一个带有计数),但我遇到了问题......

例如,频率表如下,大约有 300 条记录(都是唯一的):

    v_catego  Time
0        AA   353
1       AAC   136
2       ABB     2
3       ABC     1
4       ACA    13

300     ZZZ    33

原始数据框:

           V_vatego
    0        AA 
    1       AAC   
    2       ABB     
    3       AAC     
    4       DA  
    5       AAC
................

我想用每个实例的“时间”值替换(或添加另一个)变量:

    v_catego  new_v_catego
0        AA   353
1       AAC   136
2       ABB     2
3       AA    353
4       AAC   136
.................

我知道在 R 中有一个简单的函数可以做到这一点。 python中是否有等价物?

【问题讨论】:

    标签: python pandas frequency


    【解决方案1】:

    IIUC 你可以使用concat,但在你必须在add_categoriesSeries(列)中设置相同的类别之前:

    print df
      v_catego  Time
    0       AA   353
    1      AAC   136
    2      ABB     2
    3       AA   353
    4      AAC   136
    
    print df1
      v_catego  Time
    0      ABC     1
    1      ACA    13
    
    #remember old cat in df1
    old_cat = df1['v_catego']
    
    #set same categories in both dataframes in column v_catego
    df1['v_catego'] = df['v_catego'].cat.add_categories(df1['v_catego'])
    df['v_catego'] = df['v_catego'].cat.add_categories(old_cat)
    print df.v_catego
    0     AA
    1    AAC
    2    ABB
    3     AA
    4    AAC
    Name: v_catego, dtype: category
    Categories (5, object): [AA, AAC, ABB, ABC, ACA]
    
    print df1.v_catego
    0     AA
    1    AAC
    Name: v_catego, dtype: category
    Categories (5, object): [AA, AAC, ABB, ABC, ACA]
    
    print pd.concat([df,df1])
      v_catego  Time
    0       AA   353
    1      AAC   136
    2      ABB     2
    3       AA   353
    4      AAC   136
    0       AA     1
    1      AAC    13
    

    编辑:

    我觉得你可以用merge:

    print df
       v_catego
    0        AA
    1       AAC
    2       ABB
    3        AA
    4       AAC
    5       ABB
    6        AA
    7       AAC
    8        AA
    9       AAC
    10      AAC
    11      ABB
    12       AA
    13      AAC
    14      ABB
    15       AA
    16      AAC
    17       AA
    18      AAC
    
    df1 = df['v_catego'].value_counts()
                        .reset_index(name='count')
                        .rename(columns={'index': 'v_catego'})
    print df1
      v_catego  count
    0      AAC      8
    1       AA      7
    2      ABB      4
    
    print pd.merge(df,df1,on=['v_catego'], how='left' )
       v_catego  count
    0        AA      7
    1       AAC      8
    2       ABB      4
    3        AA      7
    4       AAC      8
    5       ABB      4
    6        AA      7
    7       AAC      8
    8        AA      7
    9       AAC      8
    10      AAC      8
    11      ABB      4
    12       AA      7
    13      AAC      8
    14      ABB      4
    15       AA      7
    16      AAC      8
    17       AA      7
    18      AAC      8
    

    【讨论】:

    • 感谢 Jezrael 的快速回复。我添加了更多的cmets。我觉得现在更清楚了...
    • 恰到好处!
    猜你喜欢
    • 2016-06-30
    • 2014-12-16
    • 2018-03-24
    • 1970-01-01
    • 2020-07-25
    • 2018-11-26
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多