2016-06-27 11 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_percとしましょう - 最初の値は46です(51は46の90の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

、あなたは私が前に、次の呼び出しに修正しました回答者のCOLの文字列値を持っていることに注意してください。その後、

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

私はdiv要素と連結使用することをお勧めします:

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 
関連する問題