私はこのようなデータフレームdf1
を持っています。別のデータフレームの列に基づいてデータフレーム内の空の値を入力してください
私は別の名前に応じて、別のデータフレームdf2
でみとめ値を持つ列score
でnan
と数0
を埋めたいです。
私はこれをどのように行うことができますか?
私はこのようなデータフレームdf1
を持っています。別のデータフレームの列に基づいてデータフレーム内の空の値を入力してください
私は別の名前に応じて、別のデータフレームdf2
でみとめ値を持つ列score
でnan
と数0
を埋めたいです。
私はこれをどのように行うことができますか?
オプション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
初回通知 'fillna'はこのようになります、ありがとうございます:)+ 1 – Wen
df1
とdf2
があなたのデータフレームの場合は、マッピングを作成してから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
おい! 'dict(df2.values)'はかなり滑らかです。私は盗んで...借りるだろう。 – piRSquared
@piRSquaredぜひ! –
またはmerge
、fillna
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'})
このメソッドは、順序を変更します(結果は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
ありがとうございます!あなたはまた答えをupvoteすることができますので、他の答えをupvoting検討してください忘れないでください。 –