【问题标题】:Calculate percentage of similar values in pandas dataframe计算熊猫数据框中相似值的百分比
【发布时间】:2020-04-17 13:13:43
【问题描述】:

我有一个数据框df,有两列:脚本(带文本)和扬声器

Script  Speaker
aze     Speaker 1 
art     Speaker 2
ghb     Speaker 3
jka     Speaker 1
tyc     Speaker 1
avv     Speaker 2 
bhj     Speaker 1

我有以下列表:L = ['a','b','c']

使用以下代码,

df = (df.set_index('Speaker')['Script'].str.findall('|'.join(L))
        .str.join('|')
        .str.get_dummies()
        .sum(level=0))
print (df)

我得到这个数据框df2

Speaker     a    b    c
Speaker 1   2    1    1
Speaker 2   2    0    0
Speaker 3   0    1    0

我可以在我的代码中添加哪一行来获得,对于我的数据框df2 的每一行,演讲者所说的所有行的百分比值,以便获得以下数据框df3

Speaker     a    b    c
Speaker 1   50%  25%   25%
Speaker 2  100%    0   0
Speaker 3   0   100%   0

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    从您的原始数据框开始,如果您想要 % 而不是分组 sum of dummies ,您可以更改整个脚本,如下所示:

    m = df.set_index('Speaker')['Script'].str.findall('|'.join(L)) #creates a list of matches
    m = m.explode().reset_index() #explode to a series 
    final = pd.crosstab(m['Speaker'],m['Script'],normalize='index').mul(100) # percentage pivot
    

    Script         a      b     c
    Speaker                      
    Speaker 1   50.0   25.0  25.0
    Speaker 2  100.0    0.0   0.0
    Speaker 3    0.0  100.0   0.0
    

    如果您不想要百分比,请使用:

    pd.crosstab(m['Speaker'],m['Script'])
    

    Script     a  b  c
    Speaker           
    Speaker 1  2  1  1
    Speaker 2  2  0  0
    Speaker 3  0  1  0
    

    注意:这里使用 pandas 0.25+ 作为版本

    【讨论】:

      【解决方案2】:

      鉴于示例,您可以尝试使用以下代码行:

      df = (df/df.sum(axis=1)[:, None]).mul(100).astype(int)
      

      使用您提供的数据:

      import pandas as pd
      import numpy as np
      data = {'a':[2,2,0],'b':[1,0,1],'c':[1,0,0]}
      df = pd.DataFrame(data)
      df = (df/df.sum(axis=1)[:, None]).mul(100).astype(int)
      print(df)
      

      输出:

           a   b   c
      0   50  25  25
      1  100   0   0
      2    0 100   0
      

      或者,如果您想添加“%”符号:

      df = (df / df.sum(axis=1)[:, None]).mul(100).astype(int).astype(str) + '%'
      

      输出:

            a     b    c
      0   50%   25%  25%
      1  100%    0%   0%
      2    0%  100%   0%
      

      【讨论】:

        【解决方案3】:
        (df.set_index('Speaker')['Script'].str.extractall(f'({"|".join(L)})')
           .groupby('Speaker')[0].value_counts(normalize=True)
           .unstack(fill_value=0)
        )
        

        输出:

        0            a     b     c
        Speaker                   
        Speaker 1  0.5  0.25  0.25
        Speaker 2  1.0  0.00  0.00
        Speaker 3  0.0  1.00  0.00
        

        【讨论】:

          【解决方案4】:

          您可以沿第一个轴除以sum,然后转换为字符串并添加%

          out = (df.set_index('Speaker')['Script'].str.findall('|'.join(L))
                   .str.join('|')
                   .str.get_dummies()
                   .sum(level=0))
          

          (out/out.sum(0)[:,None]).mul(100).astype(int).astype(str).add('%')
          
                      a     b    c
          Speaker                  
          Speaker1   50%   25%  25%
          Speaker2  100%    0%   0%
          Speaker3    0%  100%   0%
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-07
            • 2020-09-21
            • 2021-10-17
            • 2021-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-17
            相关资源
            最近更新 更多