2017-01-02 5 views
0

私の質問は以下のコードを簡素化する方法です。私の実際のデータでは、540列を追加する必要がありますが、特に列を生成するためのより良い方法があると思います。たぶん別のデータフレームですか?あなた以下関数を使用して新しい列またはデータフレームを作成しますか?

は、必要に応じて1列に私が持っているテスト-DFが表示されます。生成される「bin_X_9のニーズによる「bin_X_0」が、その後いくつかの、すなわちbin_Y_0、bin_Z_0など9

N = 10000 
J = [2012,2013,2014] 
K = ['A','B','C','D','E','F','G','H'] 
L = ['h', 'd', 'a'] 
S = ['AR1','PO1','RU1'] 

np.random.seed(0) 

df = pd.DataFrame(
    {'Y':np.random.uniform(1,10,N), 
    'X':np.random.uniform(1,10,N), 
    'Z':np.random.uniform(1,10,N), 
    'J':np.random.choice(J,N), 
    'S':np.random.choice(S,N), 
    'R':np.random.choice(L,N) 
    }) 

df['bins_X'] = df.groupby('S').X.apply(pd.qcut, q=10, labels=np.arange(10)) 

df['bin_X_0'] = np.where((df['bins_X'] ==0) & (df['R'] =='a'), (df['X']*2)-2, 
         np.where((df['bins_X'] ==0) & (df['R'] !='a'), -2, 0)) 

df.head() 

enter image description here

答えて

1

にそれについての詳細を読むことができます。次のコードは、それを行う必要があります。

for a in ["X", "Y", "Z"]: 
    for num in list(range(0, 10)): 
     df['bins_{}'.format(a)] = df.groupby('S')["{}".format(a)].apply(pd.qcut, q=10, labels=np.arange(10)) 

     df['bin_{}_{}'.format(a, num)] = np.where((df['bins_{}'.format(a)] == num) & (df['R'] == 'a'), 
                (df['{}'.format(a)] * 2) - 2, 
                np.where((df['bins_{}'.format(a)] == num) & (df['R'] != 'a'), -2, 0)) 

を現在の数字や文字が動的に適切なデータをピックアップし、すべてのネストされたループの内側に二つの新しい列を生成しているどのように私は、それが明らかであると思います。上記のコードは、私があなたが探しているものと信じているこのデータフレームを生成します:

J R S   X   Y   Z bins_X bin_X_0 bin_X_1 \ 
0 2014 d PO1 7.734412 5.939322 4.529557  7 0.000000  0.0 
1 2014 h AR1 2.621824 7.436704 1.370409  1 0.000000  -2.0 
2 2013 h PO1 4.501208 6.424870 9.309705  4 0.000000  0.0 
3 2012 a RU1 1.338402 5.903949 4.656115  0 0.676803  0.0 
4 2012 d RU1 1.106090 4.812893 9.498540  0 -2.000000  0.0 

    bin_X_2 ...  bin_Z_0 bin_Z_1 bin_Z_2 bin_Z_3 bin_Z_4 bin_Z_5 \ 
0  0.0 ...   0.0  0.0  0.0  -2.0 0.00000  0.0 
1  0.0 ...  -2.0  0.0  0.0  0.0 0.00000  0.0 
2  0.0 ...   0.0  0.0  0.0  0.0 0.00000  0.0 
3  0.0 ...   0.0  0.0  0.0  0.0 7.31223  0.0 
4  0.0 ...   0.0  0.0  0.0  0.0 0.00000  0.0 

    bin_Z_6 bin_Z_7 bin_Z_8 bin_Z_9 
0  0.0  0.0  0.0  0.0 
1  0.0  0.0  0.0  0.0 
2  0.0  0.0  0.0  -2.0 
3  0.0  0.0  0.0  0.0 
4  0.0  0.0  0.0  -2.0 

私はあなたがアイデアを得ることを望みます。

+0

おかげマルジャンは、よさそうです。私が確認しておきます、チェックします。私は言及するのを忘れていたが、一つのこと。後....フォーマット(a)] ==それは対応するビンでなければなりません。それが0である例では、あなたが示唆したように5 – Zanshin

+0

私はnum' '2つのゼロを置き換え....すなわちbin_X_5でなければなりません。さもなければ、私は計算だけを掘り下げたわけではないので、変数は変わらないかもしれません。パターンを見たら私の答えを編集してください。 –

+0

うん、これは動作します。ありがとう – Zanshin

0

を通してそれらが関連している場合は、新しい列を追加するための最良の方法DataFrameに既に存在するデータは、pd.concatまたはpd.mergeを使用することです。

あなたはあなたが現在の反復可能オブジェクトと新しい列を生成するためのformat機能を使用することにより、ループのための二重でこれを達成することができますhttp://pandas.pydata.org/pandas-docs/stable/merging.html

関連する問題