2017-12-20 8 views
0

以下のように20000+の値を持つPython DataFrameがあります。そして、NaNを値の文字列の後に置くことで、効率的にdfを再配置したい。Python DataFrame:オブジェクトと空の値を並べ替えます

IT1  IT2  IT3  IT4  IT5  IT6 
0 qwe  rew  NaN  NaN  NaN  NaN 
1 sdc  wer  NaN  NaN  NaN  NaN  
2 NaN  NaN  NaN  NaN  NaN  NaN 
3 asd  fsc  ws  zd  ews  df 
..... 

IT1  IT2  IT3  IT4  IT5  IT6 
0 qwe  NaN  NaN  rew  NaN  NaN 
1 NaN  NaN  sdc  NaN  NaN  wer 
2 NaN  NaN  NaN  NaN  NaN  NaN 
3 asd  fsc  ws  zd  ews  df 
..... 

だから、各行は、インデックス= 2のような値を持たないことができ、またはインデックス= 3のようなすべての値を効率的に私のデータフレームDFを再配置する方法はありますか? 事前のおかげで

答えて

1

一つの方法、ゆっくりとはいえ、applydropna、およびtolist

df.apply(lambda x: pd.Series(x.dropna().tolist()),1)\ 
    .set_axis(df.columns, axis=1, inplace=False) 

が出力:

IT1 IT2 IT3 IT4 IT5 IT6 
0 qwe rew NaN NaN NaN NaN 
1 sdc wer NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN NaN 
3 asd fsc ws zd ews df 
+0

set_axis()引数 'axis'に複数の値があります。<<<<このエラーが発生します。何か案は? – Kang

+0

@Kangはい、あなたはPandas 0.21.0+ Upgrade pandasを持っている必要があります。 –

1

あなたが行をソートするカスタム関数を書くことができ、その後、置き換え元の順序で列を持つインデックス(列)。単にapplyデータフレームに行単位で

def row_sort(s): 
    s2 = s.sort_values() 
    s2.index = s.index 
    return s2 

df.apply(row_sort, axis=1) 
# returns: 
    IT1 IT2 IT3 IT4 IT5 IT6 
0 qwe rew NaN NaN NaN NaN 
1 sdc wer NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN NaN 
3 asd df ews fsc ws zd 
+0

これは完璧に動作しますが、問題は1つだけです。私は、順序を維持するが、ナノ値をドロップしたいが、あなたのコードは元の順序を保持していません。たとえば、索引3の場合は、asd fsc ws zd ews df orderでなければなりません。ありがとう! – Kang

関連する問題