用于显示百分比的复杂分隔和分组方式(Pandas/Python)
困境:用于显示百分比的复杂分隔和分组方式(Pandas/Python),python,pandas,numpy,Python,Pandas,Numpy,困境: 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 Hel
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,在这里我想在一个特定的列中按复杂的格式进行分离和分组,并显示百分比。我通过关注前三个“单词”(例如:Hello Hell HE-)和字母T-12T来分离Type列中的值
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%
所需输出:
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%
正在做:
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”上拆分,然后在“-”上拆分)
但是,我不知道如何通过以下方式来区分每种类型:Hello Hell HE以及-12T
欢迎提出任何建议让我们试一试
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
让我们试试
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
你可以这样做:
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['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%
如果要获取下划线之前的所有字段:
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
如果要获取下划线之前的所有字段:
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
您如何定义
-12T
和-90T
是您感兴趣的部分?这是因为它们是两位数字,后跟'T'
,还是因为它们是'
之前的最后一位?由于放置-我看到它们位于“6”位,由连字符分隔。位于第5位的部分将是'12T\u TYPE'
。df['TYPE']。值\u计数(normalize=True)*100)。到帧()
不可能正确,缺少一个(
。在\uu
上拆分,然后在-
上拆分,然后将前三个字符串和最后一个字符串组合在一起,形成一个新索引,怎么样?好的,谢谢@PaulBrennan,我将尝试一下。您如何定义-12T
和-90T
是您感兴趣的部分?是因为它们后面有两个数字吗通过'T'
,或者是因为它们是'
之前的最后一位?由于放置-我看到它们位于由连字符分隔的“6”位第5位的部分将是'12T_TYPE'
。df['TYPE']。值计数(normalize=True)*100。到_frame()
不能正确,缺少(
。在上拆分,然后在-
上拆分,然后将前三个字符串和最后一个字符串组合在一起,形成一个新索引,怎么样?好的,谢谢你@PaulBrennan,我会尝试使用值计数
!好的,让我试试这个,谢谢你@WWND,如果有帮助的话,看看我所做的编辑。这是计算的本质真的是这样。它对我有效。除非你有其他列。如果可能的话,这是我使用的数据;df=pd.DataFrame({'Type':['Hello-Hell-HE-A6123-123A-12T_TYPE-v.A'、'Hello-Hell-HE-A6123-123A-12T_TYPE-v.B'、'Hello-Hell-HE-A6123-123A-12T_TYPE-v.E'、'Hello-Hell-HE-A6123-123A-50T_TYPE-v.A'、'Happy-HAP-HAP-HAP-R650-570A-90T_-v.A'、'1116'、'1116'、'1116'、'23427'、'
如果问题出在值的爆炸上,请尝试df=df.assign(Type=df.Type.str.split('''').str[0])df2=(df['Type'].Value_计数(normalize=True)*100)。to_frame('%')打印(df2.重命名_轴(index='Type'))
很好地使用了value\u counts
!好的,让我试试这个谢谢@wwndee如果有帮助的话,看看我的编辑。这是计算的本质,确实如此。它对我有效。除非你有其他列。如果可能的话,这是我使用的数据;df=pd.DataFrame({'Type':['Hello-Hell-HE-A6123-123A-12T_TYPE-v.A'、'Hello-Hell-HE-A6123-123A-12T_TYPE-v.B'、'Hello-Hell-HE-A6123-123A-12T_TYPE-v.E'、'Hello-Hell-HE-A6123-123A-50T_TYPE-v.A'、'Happy-HAP-HAP-HAP-R650-570A-90T_-v.A'、'1116'、'1116'、'1116'、'23427'、'
如果问题出在值的爆炸上,请尝试df=df.assign(Type=df.Type.str.split('''').str[0])df2=(df['Type'].Value_计数(normalize=True)*100)。to_frame('%')打印(df2.重命名_轴(index='Type'))
好的,让我试试这个谢谢@pierreok,让我试试这个谢谢@pierreok,让我试试这个谢谢@brunook,让我试试这个谢谢@bruno