2016-06-27 2 views
2

백분율 값을 나타내는 새로운 열을 만들기 위해 선택 데이터 프레임 열의 값을 순환하지 않습니다. 재현 가능한 예 :팬다 : 백분율 값의 수많은 열을 계산하십시오.

data = {'Respondents': [90, 43, 89, '89', '67', '88', '73', '78', '62', '101'], 
     'answer_1': [51, 15, 15, 61, 16, 14, 15, 1, 0, 16], 
     'answer_2': [11, 12, 14, 40, 36, 78, 12, 0, 26, 78], 
     'answer_3': [3, 8, 4, 0, 2, 7, 10, 11, 6, 7]} 
df = pd.DataFrame(data) 
df 

    Respondents answer_1 answer_2 answer_3 
0 90   51   11   3 
1 43   15   12   8 
2 89   15   14   4 
3 89   61   35   0 
4 67   16   36   2 
5 88   14   78   7 
6 73   15   12   10 
7 78   1   0   11 
8 62   0   26   6 
9 101   16   78   7 

목표는 전체 응답자에 대한 각 대답 열의 백분율을 계산하는 것입니다. 예를 들어 새로운 answer_1 열의 경우 - answer_1_perc으로 지정하고 첫 번째 값은 46입니다 (51은 46의 90이기 때문에). 다음 값은 35입니다 (15는 43의 35 % 임). 그런 다음 answer_2_percanswer_3_perc 열이 있습니다.

다음 코드를 너무 많이 반복하여 작성했습니다.

for columns in df.iloc[:, 1:4]: 
for i in columns: 
    i_name = 'percentage_' + str(columns) 
    i_group = ([i]/df['Respondents'] * 100) 
    df[i_name] = i_group 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 내 실제 데이터가이 예제에 표시된 3 개의 응답 열 대신 25 개의 응답 열을 가지므로 반복적 인 방법을 사용해야합니다.

답변

3

당신은 거의 그것을했다가, 응답자 내가 전에 전화로 수정 한 어떤 내지 컬럼에 당신이 문자열 값을 가지고 다음 사항에 유의하십시오

In [172]: 

for col in df.columns[1:4]: 
    i_name = 'percentage_' + col 
    i_group = (df[col]/df['Respondents']) * 100 
    df[i_name] = i_group 

df 
Out[172]: 
    Respondents answer_1 answer_2 answer_3 percentage_answer_1 \ 
0   90  51  11   3   56.666667 
1   43  15  12   8   34.883721 
2   89  15  14   4   16.853933 
3   89  61  40   0   68.539326 
4   67  16  36   2   23.880597 
5   88  14  78   7   15.909091 
6   73  15  12  10   20.547945 
7   78   1   0  11    1.282051 
8   62   0  26   6    0.000000 
9   101  16  78   7   15.841584 

    percentage_answer_2 percentage_answer_3 
0   12.222222    3.333333 
1   27.906977   18.604651 
2   15.730337    4.494382 
3   44.943820    0.000000 
4   53.731343    2.985075 
5   88.636364    7.954545 
6   16.438356   13.698630 
7    0.000000   14.102564 
8   41.935484    9.677419 
9   77.227723    6.930693 
0

Respondents하여 다음 새에 추가 div 원하는 열이있는 또 다른 방법 열 이름 :

print ('percentage_' + df.columns[1:4]) 
Index(['percentage_answer_1', 'percentage_answer_2', 'percentage_answer_3'], dtype='object') 

df['percentage_' + df.columns[1:4]] = df.ix[:,1:4].div(df.Respondents, axis=0) * 100 
print (df) 
    Respondents answer_1 answer_2 answer_3 percentage_answer_1 \ 
0   90  51  11   3   56.666667 
1   43  15  12   8   34.883721 
2   89  15  14   4   16.853933 
3   89  61  40   0   68.539326 
4   67  16  36   2   23.880597 
5   88  14  78   7   15.909091 
6   73  15  12  10   20.547945 
7   78   1   0  11    1.282051 
8   62   0  26   6    0.000000 
9   101  16  78   7   15.841584 

    percentage_answer_2 percentage_answer_3 
0   12.222222    3.333333 
1   27.906977   18.604651 
2   15.730337    4.494382 
3   44.943820    0.000000 
4   53.731343    2.985075 
5   88.636364    7.954545 
6   16.438356   13.698630 
7    0.000000   14.102564 
8   41.935484    9.677419 
9   77.227723    6.930693 
2

내가 사업부와 CONCAT 사용하는 것이 좋습니다 :

df['Respondents'] = df['Respondents'].astype(float) 
df_pct = (df.drop('Respondents', axis=1) 
      .div(df['Respondents'], axis=0) 
      .mul(100) 
      .rename(columns=lambda col: 'percentage_' + col) 
     ) 
pd.concat([df, df_pct], axis=1) 

    Respondents answer_1 answer_2 answer_3 percentage_answer_1 \ 
0   90.0  51  11   3   56.666667 
1   43.0  15  12   8   34.883721 
2   89.0  15  14   4   16.853933 
3   89.0  61  40   0   68.539326 
4   67.0  16  36   2   23.880597 
5   88.0  14  78   7   15.909091 
6   73.0  15  12  10   20.547945 
7   78.0   1   0  11    1.282051 
8   62.0   0  26   6    0.000000 
9  101.0  16  78   7   15.841584 

    percentage_answer_2 percentage_answer_3 
0   12.222222    3.333333 
1   27.906977   18.604651 
2   15.730337    4.494382 
3   44.943820    0.000000 
4   53.731343    2.985075 
5   88.636364    7.954545 
6   16.438356   13.698630 
7    0.000000   14.102564 
8   41.935484    9.677419 
9   77.227723    6.930693 
관련 문제