2017-06-27 3 views
1

1つの行から別の行に移動する必要があるレコードが1つの列で不足しています。ここでN/Aの行に列の値が一致する行の値を入力する方法

は例です:

df1 = pd.DataFrame({'animal':['horse','cat','cat','dog'], 
        'type':['big','small',np.nan,'medium'], 
        'rating':[1,2,np.nan,2]}) 

print(df1) 

出力:

animal rating type 
0 horse  1  big 
1 cat  2 small 
2 cat  NaN  NaN 
3 dog  2 medium 

所望の出力:

animal rating type 
0 horse  1  big 
1 cat  2 small 
2 cat  2 small 
3 dog  2 medium 

答えて

2

あなたの行は常にffillに対して正しく並んでされていない場合は()、データフレームを良いものと悪いものに分け、悪いものを修正して再結合することで同じ結果を達成することができます。たとえば:

df1 = pd.DataFrame({'animal':['horse','cat','cat','dog'], 
        'type':['big','small',np.nan,'medium'], 
        'rating':[1,2,np.nan,2]}) 
df1.set_index('animal',inplace=True) 
good_df1 = df1[~df1.isnull().any(axis=1)] 
bad_df1 = df1[df1.isnull().any(axis=1)] 
final = pd.concat([good_df1, bad_df1.fillna(good_df1)]).reset_index() 

与える:だけで、特定の列を記入して、最後の行を置き換える

animal rating type 
0 horse  1.0  big 
1 cat  2.0 small 
2 dog  2.0 medium 
3 cat  2.0 small 

へ:

fill_cols = ['rating'] 
final = pd.concat([good_df1, bad_df1[fill_cols].fillna(good_df1[fill_cols])]).reset_index() 

または:

fill_cols = list(df1.columns) 
fill_cols.remove('type') 
final = pd.concat([good_df1, bad_df1[fill_cols].fillna(good_df1[fill_cols])]).reset_index() 

また場合データセットを使用することができます前述のようにffill()を実行しますが、適切なデータが最初に表示されるように追加の並べ替え手順が必要です。

df1.sort_values(['animal','rating','type']).fillna(method='ffill') 
+0

ありがとうございました! 「型」のような特定の列を無視する方法はありますか? – ethanenglish

+1

確かに、上記の2つの方法、ホワイトリストまたはブラックリストを追加 – tvashtar

関連する問題