2017-03-23 6 views
1

私はちょっと不器用なタイトルをお詫びします。私は問題の核心を見ている。簡単に言えば、データフレームと、列または行の数と同じ長さのリストがあります。データフレームのnotnullの値をリストの対応する値に置き換えたいと思います。ここでpandasデータフレームのnotnull値をリストの値で置き換える/ notnull値のインデックスを取得する方法/ブールインデックスの実装

は例です: 入力データフレーム:

  a   b   c   d 
a 0.547825  NaN  NaN 0.950158 
b  NaN 0.663845 0.529115  NaN 
c  NaN  NaN  NaN 0.685002 
d  NaN 0.791249 0.574452 0.734804 

入力リスト:[1, 2, 3, 4]

所望の出力:

frame = pd.DataFrame(np.random.rand(4,4),index=['a','b','c','d'], columns=['a','b','c','d']) 
frame = np.asarray(frame) 
frame[frame<0.5] = np.nan 
frame = pd.DataFrame(frame,index=['a','b','c','d'], columns=['a','b','c','d']) 

result = np.zeros((4,4)) 
result = pd.DataFrame(result, index=['A','B','C','D'], columns=['A','B','C','D']) 
Somenums = [1,2,3,4] 

for i, col in enumerate(frame.columns.values): 
    print frame[col] 
    print np.isfinite(frame[col]) 
    mask = frame.ix[np.isfinite(frame[col]),col] 
    print mask 
    print Somenums[mask] 
    result.iloc[:,i] = Somenums[mask] 
print result 

  a   b   c   d 
a   1  NaN  NaN  4 
b  NaN   2   3  NaN 
c  NaN  NaN  NaN   4 
d  NaN   2   3   4 

これは、現在、私のコードです

しかし、私は受け取る:

TypeError         Traceback (most recent call last) 
<ipython-input-34-c95f4f5ee05b> in <module>() 
    24  mask = frame.ix[np.isfinite(frame[col]),col] 
    25  print mask 
---> 26  print Somenums[mask] 
    27  result.iloc[:,i] = Somenums[mask] 
    28 print result 

TypeError: list indices must be integers, not Series 

は、どのように私は、インデックスには、適切に/正しくマスクを適用することができますか?

+1

'Somenums [マスク]'の行を削除します。 'frame.iloc [frame.iloc [:、i] .notnull()。values、i] = Somenums [i]'はうまくいくはずですか? – Psidom

+0

それは、華麗です! – durbachit

+0

あなたが回答として投稿すると、私はそれを受け入れます。 – durbachit

答えて

1

'mask'はインデックスまたはブール値の代わりにデータ系列なので、エラーが発生したようです。代わりに、forループのIはの考えることができる方法は、実行します。

idx = frame.notnull() 
result = idx * Somenums 
result[~idx] = None 

あなたは出力にNaNを置き換えるためにゼロを持つ気にしない場合は、あなたが行うことができます:

result = frame.notnull() * Somenums 
+0

クール、これも動作します! (いいえ、残念ながら私はゼロを持つことはできませんが、他の解決策は素晴らしいです。) – durbachit

1

あなたはlistから、maskを使用することができる必要があるdfの列名と同じインデックスでSeriesを作成する:

Somenums = [1, 2, 3, 4] 

df = df.mask(df.notnull(), pd.Series(Somenums, index=df.columns), axis=1) 
print (df) 
    a b c d 
a 1.0 NaN NaN 4.0 
b NaN 2.0 3.0 NaN 
c NaN NaN NaN 4.0 
d NaN 2.0 3.0 4.0 
関連する問題