2017-08-25 19 views
1

私はこのようなデータフレームdf1を持っています。別のデータフレームの列に基づいてデータフレーム内の空の値を入力してください

enter image description here

私は別の名前に応じて、別のデータフレームdf2でみとめ値を持つ列scorenanと数0を埋めたいです。

enter image description here

私はこれをどのように行うことができますか?

+2

ありがとうございます!あなたはまた答えをupvoteすることができますので、他の答えをupvoting検討してください忘れないでください。 –

答えて

3

オプション1
ショートバージョン

を使用して を用い
df1.score = df1.score.mask(df1.score.eq(0)).fillna(
    df1.name.map(df2.set_index('name').score) 
) 
df1 

    name score 
0 A 10.0 
1 B 32.0 
2 A 10.0 
3 C 30.0 
4 B 20.0 
5 A 45.0 
6 A 10.0 
7 A 10.0 

オプション2
興味深いバージョン。 df2'name'でソートする必要があります。

i = np.where(np.isnan(df1.score.mask(df1.score.values == 0).values))[0] 
j = df2.name.values.searchsorted(df1.name.values[i]) 
df1.score.values[i] = df2.score.values[j] 
df1 

    name score 
0 A 10.0 
1 B 32.0 
2 A 10.0 
3 C 30.0 
4 B 20.0 
5 A 45.0 
6 A 10.0 
7 A 10.0 
+0

初回通知 'fillna'はこのようになります、ありがとうございます:)+ 1 – Wen

2

df1df2があなたのデータフレームの場合は、マッピングを作成してからpd.Series.replaceを呼び出すことができます。

df1 = pd.DataFrame({'name' : ['A', 'B', 'A', 'C', 'B', 'A', 'A', 'A'], 
        'score': [0, 32, 0, np.nan, np.nan, 45, np.nan, np.nan]}) 
df2 = pd.DataFrame({'name' : ['A', 'B', 'C'], 'score' : [10, 20, 30]}) 

print(df1) 

    name score 
0 A 0.0 
1 B 32.0 
2 A 0.0 
3 C NaN 
4 B NaN 
5 A 45.0 
6 A NaN 
7 A NaN 

print(df2) 

    name score 
0 A  10 
1 B  20 
2 C  30 

mapping = dict(df2.values) 

df1.loc[(df1.score.isnull()) | (df1.score == 0), 'score'] =\ 
       df1[(df1.score.isnull()) | (df1.score == 0)].name.replace(mapping) 

print(df1) 

    name score 
0 A 10.0 
1 B 32.0 
2 A 10.0 
3 C 30.0 
4 B 20.0 
5 A 45.0 
6 A 10.0 
7 A 10.0 
+2

おい! 'dict(df2.values)'はかなり滑らかです。私は盗んで...借りるだろう。 – piRSquared

+0

@piRSquaredぜひ! –

1

またはmergefillna

import pandas as pd 
import numpy as np 

df1.loc[df.score==0,'score']=np.nan 
df1.merge(df2,on='name',how='left').fillna(method='bfill',axis=1)[['name','score_x']]\ 
    .rename(columns={'score_x':'score'}) 
1

このメソッドは、順序を変更します(結果はnameでソートされます)。

df1.set_index('name').replace(0, np.nan).combine_first(df2.set_index('name')).reset_index() 

    name score 
0 A  10 
1 A  10 
2 A  45 
3 A  10 
4 A  10 
5 B  32 
6 B  20 
7 C  30 
関連する問題