2016-08-12 5 views
4

入力データフレーム(短縮)を条件(サンプル機能)を操作するには、次のようになります。特定の列に/ numpyのデータフレームをパンダを使用して別の列のエントリ(特徴量)

>>> import numpy as np 
>>> import pandas as pd 

>>> df_in = pd.DataFrame([[1, 2, 'a', 3, 4], [6, 7, 'b', 8, 9]], 
...      columns=(['c1', 'c2', 'col', 'c3', 'c4'])) 
>>> df_in 
    c1 c2 col c3 c4 
0 1 2 a 3 4 
1 6 7 b 8 9 

それがになっています操作され、すなわち

(機能)列「COL」の行(サンプル)が特定の値(ここでは例えば、「B」)を有する場合、 次に列「C1」および「C2」でのエントリを変換同じ行からNまでumPy.NaNs。

結果が欲しかった:

>>> df_out = pd.DataFrame([[1, 2, 'a', 3, 4], [np.nan, np.nan, np.nan, 8, 9]], 
         columns=(['c1', 'c2', 'col', 'c3', 'c4'])) 
>>> df_out 
    c1 c2 col c3 c4 
0 1 2 a 3 4 
1 NaN NaN b 8 9 

をこれまでのところ、私は私が何を私取得してもコード

>>> dic = {'col' : ['c1', 'c2']}   # auxiliary 

>>> b_w = df_in[df_in['col'] == 'b']  # Subset with 'b' in 'col' 
>>> b_w = b_w.drop(dic['col'], axis=1) # ...inject np.nan in 'c1', 'c2' 

>>> b_wo = df_in[df_in['col'] != 'b']  # Subset without 'b' in 'col' 

>>> df_out = pd.concat([b_w, b_wo])  # Both Subsets together again 
>>> df_out 
    c1 c2 c3 c4 col 
1 NaN NaN 8 9 b 
0 1.0 2.0 3 4 a 

経由所望の結果を得る得ることができました欲しいジーナルデータは完全に浮動小数点で構成されていますが、 はintから突然変異を邪魔しないようにしています)、むしろ面白味のない コードスニペットです。そして私の推測では、pandasとnumpyの組み込み関数を使って、これをより速く実行できるということです。しかし、これを管理することはできません。

でこれをコード化する方法を提案します。速くて効率的です毎日の使用方法ですか?どんな助けも高く評価されます。 :)

答えて

4
あなたは、論理インデックスとディメンション名のインデックスの両方をサポートしてい locを使用して値を割り当てるために、両方の行とCOLの位置に調節することができ

df_in.loc[df_in.col == 'b', ['c1', 'c2']] = np.nan 

df_in 
# c1 c2 col c3 c4 
# 0 1.0 2.0 a 3 4 
# 1 NaN NaN b 8 9 
0

私が提供される解決策のために行くだろうパンダを使用して@Psidomによる。全体パンダを行うとき

はしかし、大規模なデータセットのためにそれは高速です - > numpyの - >パンダ手順、すなわちデータフレーム - > numpy.array - >データフレーム(私のセットアップのためのマイナス10%の処理時間)。データフレームに変換することなく、numpyは私のデータセットの約2倍の速さです。

cols, df_out = df_in.columns, df_in.values 
for i in [0, 1]: 
    df_out[df_out[:, 2] == 'b', i] = np.nan 
df_out = pd.DataFrame(df_out, columns=cols) 
:尋ねた質問には

ソリューション

関連する問題