Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于显示百分比的复杂分隔和分组方式(Pandas/Python)_Python_Pandas_Numpy - Fatal编程技术网

用于显示百分比的复杂分隔和分组方式(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