【问题标题】:Complex separation and groupby to display percentages (Pandas/Python)复杂的分离和分组显示百分比(Pandas/Python)
【发布时间】:2020-12-18 04:51:57
【问题描述】:

困境:

我有一个数据集 df,我想在其中对特定列中的复杂格式进行分离和分组,并显示百分比。我通过关注前三个“单词”(例如)Hello-HEL-HE- 和后跟字母 T -12T

的值
There are    3  unique counts    of   Hello-HEL-HE-A6123-123A-12T
             2  unique counts    of   Hello-HEL-HE-A6123-123A-50T
             1  unique count(s)  of   Happy-HAP-HA-R650-570A-90T    

数据:

Type                                    Value

Hello-HEL-HE-A6123-123A-12T_TYPE-v.A    1,111,111
Hello-HEL-HE-A6123-123A-12T_TYPE-v.B    111,111
Hello-HEL-HE-A6123-123A-12T_TYPE-v.E    2,345,667
Hello-HEL-HE-A6123-123A-50T_TYPE-v.C    222,334
Hello-HEL-HE-A6123-123A-50T_TYPE-v.A    89
Happy-HAP-HA-R650-570A-90T_version-v.A  6

期望的输出:

Type                                    Percent

Hello-HEL-HE-12T                        50%
Hello-HEL-HE-50T                        33%
Happy-HAP-HA-90T                      16.6%

正在做:

(建议在'_'上分割,然后在'-'上分割)

df.str.split(pat="_")                                      #separating by hyphen

(df['Type'].value_counts(normalize=True) * 100).to_frame()  #groupby

但是,我不确定如何通过 Hello-HEL-HE 和 -12T 来区分每种类型

欢迎提出任何建议

【问题讨论】:

  • 您如何定义-12T-90T 是您感兴趣的部分?是因为它们是两位数,后跟'T',还是因为它们是'_'之前的最后一位?
  • 由于放置 - 我看到它们位于由连字符分隔的“第 6”位
  • 第 5 位的部分将是 '12T_TYPE'...
  • df['Type'].value_counts(normalize=True) * 100).to_frame() 不正确,缺少(。在_ 上拆分然后在- 上拆分然后将前三个和最后一个字符串组合在一起以创建一个新索引怎么样?
  • 好的,谢谢@PaulBrennan 我会试试这个

标签: python pandas numpy


【解决方案1】:

我们试试

df=df.assign(Value=df['Value'].str.split(','),Type=df.Type.str.split('_').str[0])
df2=(df['Type'].value_counts(normalize=True)*100).to_frame('%')
df2.rename_axis(index='Type')
 



                                   %
Type                                  
Hello-HEL-HE-A6123-123A-12T  50.000000
Hello-HEL-HE-A6123-123A-50T  33.333333
Happy-HAP-HA-R650-570A-90T   16.666667

【讨论】:

  • 很好地使用value_counts
  • 好的,谢谢——只是想知道,为什么我们在对 Type col 进行分组时要引用 Value 列?
  • 如果有帮助,请查看我的编辑。真正推动这种方式的计算的性质。
  • 它对我有用。除非您有其他列。如果有帮助,这是我使用的数据; df=pd.DataFrame({'Type':['Hello-HEL-HE-A6123-123A-12T_TYPE-v.A','Hello-HEL-HE-A6123-123A-12T_TYPE-v.B','Hello-HEL-HE-A6123-123A-12T_TYPE-v.E','Hello-HEL-HE-A6123-123A-50T_TYPE-v.C','Hello-HEL-HE-A6123-123A-50T_TYPE-v.A','Happy-HAP-HA-R650-570A-90T_version-v.A'],'Value':['1,111,111','111,111','2,345,667','222,334','89','6']})
  • 以防Value 爆炸是问题所在。你能试试df=df.assign(Type=df.Type.str.split('_').str[0]) df2=(df['Type'].value_counts(normalize=True)*100).to_frame('%') print(df2.rename_axis(index='Type'))
【解决方案2】:

你可以这样做:

df['Type'].str.split('_').str[0].value_counts(normalize=True)

Hello-HEL-HE-A6123-123A-12T    0.500000
Hello-HEL-HE-A6123-123A-50T    0.333333
Happy-HAP-HA-R650-570A-90T     0.166667

如果你想要那种特定的形式,那么:

tmp = df['Type'].str.split('_').str[0].value_counts(normalize=True).reset_index(name='percentage').rename(columns={'index': 'Type'})

tmp['percentage'] = tmp['percentage'].apply(lambda x: '{:.2f}%'.format(100*x))

tmp

Type percentage
Hello-HEL-HE-A6123-123A-12T     50.00%
Hello-HEL-HE-A6123-123A-50T     33.33%
Happy-HAP-HA-R650-570A-90T     16.67%

【讨论】:

    【解决方案3】:

    如果要获取下划线前的所有字段:

    key = df.Type.str.split(r'_', n=1, expand=True)[0]
    key
    
    # out:
    0    Hello-HEL-HE-A6123-123A-12T
    1    Hello-HEL-HE-A6123-123A-12T
    2    Hello-HEL-HE-A6123-123A-12T
    3    Hello-HEL-HE-A6123-123A-50T
    4    Hello-HEL-HE-A6123-123A-50T
    5     Happy-HAP-HA-R650-570A-90T
    

    如果您想要前三个单词,以及下划线之前的最后一个单词,那么:

    a = df.Type.str.split(r'_', n=1, expand=True)[0].str.split(r'-', expand=True)
    sel = list(a.columns)
    sel = sel[1:3] + sel[-1:]
    key = a[0].str.cat(a[sel], '-')
    key
    
    # out:
    0    Hello-HEL-HE-12T
    1    Hello-HEL-HE-12T
    2    Hello-HEL-HE-12T
    3    Hello-HEL-HE-50T
    4    Hello-HEL-HE-50T
    5    Happy-HAP-HA-90T
    

    在任何一种情况下,您都可以按该键分组:

    cnt = df.groupby(key)['Value'].count()
    100 * cnt / cnt.sum()
    
    # out:
    Happy-HAP-HA-90T    16.666667
    Hello-HEL-HE-12T    50.000000
    Hello-HEL-HE-50T    33.333333
    

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多