2016-05-13 6 views
1

私は、たくさんのNaNを持つ大きなデータフレームを持っています。私はそれをすべてのインデックスとその値を格納する小さなデータフレームに格納したい-NaN、非ゼロ値。NaN以外の要素のインデックスとDataFrameからの値を取得する方法

dff = pd.DataFrame(np.random.randn(4,3), columns=list('ABC')) 
dff.iloc[0:2,0] = np.nan 
dff.iloc[2,2] = np.nan 
dff.iloc[1:4,1] = 0 

データフレームは次のようになります。

A    B    C 
0 NaN   -2.268882  0.337074 
1 NaN   0.000000  1.340350 
2 -1.526945 0.000000  NaN 
3 -1.223816 0.000000  -2.185926 

は、私は、データフレームは次のようになりたい:

0 B -2.268882 
0 C 0.337074 
1 C 1.340350 
2 A -1.526945 
3 A -1.223816 
4 C -2.185926 

私が持っているように私は、すぐにそれを行うことができますどのように比較的大きなデータフレーム、何千もの...

多くのありがとう!

答えて

2

0np.nan.stack()と置き換えると、結果は(see docs)になります。

あなたは.replace()rowsにすべてnp.nan値を持つ可能性がある場合、あなたはピボットに行の数を減らすために.stack().dropna(how='all')を行うことができます。それがcolumnsに当てはまる場合、 `.dropna(how = 'all'、axis = 1)を実行します。

df.replace(0, np.nan).stack() 

0 B -2.268882 
    C 0.337074 
1 C 1.340350 
2 A -1.526945 
3 A -1.223816 
    C -2.185926 

必要に応じて.reset_index()と組み合わせてください。 docs中などをスライス上

df.loc[(0, 'B')] = -2.268882 

詳細:MultiIndex使用.loc[(level_0, level_1)]Seriesから選択するには

+0

この部分をスキップして更新しました。 – Stefan

+0

更新された回答を参考にして、関連する文書を参照してください。 – Stefan

0

私は物事を達成するために少し醜い方法を思いついたが、ちょっと、それは動作します。しかし、この解決策は0からの指数を持ち、あなたの質問と同じように 'A'、 'B'、 'C​​'の元の順序を保持しません。

import pandas as pd 
import numpy as np 
dff = pd.DataFrame(np.random.randn(4,3), columns=list('ABC')) 
dff.iloc[0:2,0] = np.nan 
dff.iloc[2,2] = np.nan 
dff.iloc[1:4,1] = 0 
dff.iloc[2,1] = np.nan 
​ 
# mask to do logical and for two lists 
mask = lambda y,z: list(map(lambda x: x[0] and x[1], zip(y,z))) 
# create new frame 
new_df = pd.DataFrame() 
types = [] 
vals = [] 
# iterate over columns 
for col in dff.columns: 
    # get the non empty and non zero values from current column 
     data = dff[col][mask(dff[col].notnull(), dff[col] != 0)] 
     # add corresponding original column name 
     types.extend([col for x in range(len(data))]) 
     vals.extend(data) 
     # populate the dataframe 
new_df['Types'] = pd.Series(types) 
new_df['Vals'] = pd.Series(vals) 
​ 
print(new_df) 
#   A   B   C 
#0  NaN -1.167975 -1.362128 
#1  NaN 0.000000 1.388611 
#2 1.482621  NaN  NaN 
#3 -1.108279 0.000000 -1.454491 
# Types  Vals 
#0  A 1.482621 
#1  A -1.108279 
#2  B -1.167975 
#3  C -1.362128 
#4  C 1.388611 
#5  C -1.454491 

私は自分自身に答えるようpandas/python以上のために楽しみにしています!

関連する問題