简体   繁体   中英

Convert Pandas dataframe values to percentage

I have a dataframe df I want to calculate the percentage based on the column total .

Suppose I have:

df = pd.DataFrame({
    'ID': range(1, 4),
    'col1': [10, 5, 10],
    'col2': [15, 10, 15],
    'col3': [10, 15, 15],
    'total': [35, 30, 40]
})

print(df)

     ID  col1 col2 col3 total
0     1    10   15   10    35
1     2    5    10   15    30
2     3    10   15   15    40

I want to get:

     ID       col1       col2       col3      total
0     1    28.57 %    42.85 %    28.57 %      100 %
1     2    16.66 %    33.33 %       50 %      100 %
2     3       25 %      37.5%     37.5 %      100 %

Use

>>> df.iloc[:, 1:] = df.iloc[:, 1:].div(df['total'], axis=0).mul(100).round(2).astype(str).add(' %')
>>> df 
   ID     col1     col2     col3    total
0   1  28.57 %  42.86 %  28.57 %  100.0 %
1   2  16.67 %  33.33 %   50.0 %  100.0 %
2   3   25.0 %   37.5 %   37.5 %  100.0 %

You can use:

import pandas as pd
df = pd.DataFrame({
    'ID': range(1, 4),
    'col1': [10, 5, 10],
    'col2': [15, 10, 15],
    'col3': [10, 15, 15],
    'total': [35, 30, 40]
})

idx = ['col1', 'col2', 'col3', 'total']

df[idx] = df[idx].apply(lambda x: x / x['total'], axis=1)
df

which gives you:

|    |   ID |     col1 |     col2 |     col3 |   total |
|---:|-----:|---------:|---------:|---------:|--------:|
|  0 |    1 | 0.285714 | 0.428571 | 0.285714 |       1 |
|  1 |    2 | 0.166667 | 0.333333 | 0.5      |       1 |
|  2 |    3 | 0.25     | 0.375    | 0.375    |       1 |

You can use div or divide , and perform division on bulk column and assign them back, and in case if you don't know the index of the column, you can just use the column labels.

cols = ['col1', 'col2', 'col3', 'total']

df[cols] = df[cols].divide(df['total'], axis=0)*100

OUTPUT :

   ID       col1       col2       col3  total
0   1  28.571429  42.857143  28.571429  100.0
1   2  16.666667  33.333333  50.000000  100.0
2   3  25.000000  37.500000  37.500000  100.0

If you want the values to round and to be represented as string with % sign, you can just use round and convert it to string and add the % sign

df[cols] = (df[cols].divide(df['total'], axis=0)*100).round(2).astype(str) + ' %'

OUTPUT :

   ID     col1     col2     col3    total
0   1  28.57 %  42.86 %  28.57 %  100.0 %
1   2  16.67 %  33.33 %   50.0 %  100.0 %
2   3   25.0 %   37.5 %   37.5 %  100.0 %
df = pd.DataFrame({
    'ID': range(1, 4),
    'col1': [10, 5, 10],
    'col2': [15, 10, 15],
    'col3': [10, 15, 15],
    'total': [35, 30, 40]
})

cols = ['col1', 'col2', 'col3', 'total']
for col in cols:
    df[col] = (df[col]/df['total']*100).round(2).astype(str) + ' %'

Output

    ID  col1    col2    col3    total
0   1   28.57 % 42.86 % 28.57 % 100.0 %
1   2   16.67 % 33.33 % 50.0 %  100.0 %
2   3   25.0 %  37.5 %  37.5 %  100.0 %
import pandas as pd 

df = pd.DataFrame({
    'ID': range(1, 4),
    'col1': [10, 5, 10],
    'col2': [15, 10, 15],
    'col3': [10, 15, 15],
    'total': [35, 30, 40]
})

df['col1'] = (df['col1']/df['total']).mul(100).round(2).astype(str).add('%')
df['col2'] = (df['col2']/df['total']).mul(100).round(2).astype(str).add('%')
df['col3'] = (df['col3']/df['total']).mul(100).round(2).astype(str).add('%')
df['total'] = (df['total']/df['total']).mul(100).round(2).astype(str).add('%')


print(df)

prints

   ID    col1    col2    col3   total
0   1  28.57%  42.86%  28.57%  100.0%
1   2  16.67%  33.33%   50.0%  100.0%
2   3   25.0%   37.5%   37.5%  100.0%

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM