用于显示百分比的复杂分隔和分组方式(Pandas/Python)

2024-10-04 11:24:21 发布

您现在位置:Python中文网/ 问答频道 /正文

困境:

我有一个数据集df,在这里我想在一个特定的列中按复杂的格式进行分离和分组,并显示百分比。我将通过关注前三个“单词”(例如:Hello Hell 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%

正在做:

(建议先在“u”上拆分,然后在“-”上拆分)

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

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

但是,我不知道如何通过以下方式来区分每种类型:Hello Hell HE以及-12T

如有任何建议,我们将不胜感激


Tags: of数据hellodftypeheuniquehappy
3条回答

你可以这样做:

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%

让我们试试

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

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

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

相关问题 更多 >