は2可能な解決策があり、それがより良い第一印象の出力です。
私はあなたが列col_1
とcol1_id
で作成された辞書d
でmap
が必要だと思う:
d = df[['col_1','col1_id']].set_index('col_1').to_dict()
print d
{'col1_id': {'A': 1, 'B': 2, 'E': 5, 'D': 3, 'H': 7, 'K': 8, 'J': 4, 'Z': 6}}
df['col2_id'] = df.col_2.map(d['col1_id'])
print df
col_1 col1_id col_2 col2_id
0 A 1 NaN NaN
1 B 2 K 8.0
2 D 3 A 1.0
3 J 4 NaN NaN
4 E 5 H 7.0
5 Z 6 NaN NaN
6 H 7 H 7.0
7 K 8 Z 6.0
それとも、where
でisin
を使用することができます。
print df.col_1.isin(df.col_2)
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
Name: col_1, dtype: bool
df['col2_id'] = df.col1_id.where(df.col_1.isin(df.col_2))
print df
col_1 col1_id col_2 col2_id
0 A 1 NaN 1.0
1 B 2 K NaN
2 D 3 A NaN
3 J 4 NaN NaN
4 E 5 H NaN
5 Z 6 NaN 6.0
6 H 7 H 7.0
7 K 8 Z 8.0
タイミング:
def pil(df):
df = df.set_index('col_1')
df['col2_id'] = df.col_2.apply(lambda x: x if pd.isnull(x) else df.loc[x, 'col1_id'])
return df.reset_index()
def jez(df):
df['col2_id'] = df.col_2.map(df.set_index('col_1').to_dict()['col1_id'])
return df
print pil(df1)
print jez(df)
In [34]: %timeit jez(df)
1000 loops, best of 3: 1.48 ms per loop
In [35]: %timeit pil(df1)
The slowest run took 4.23 times longer than the fastest. This could mean that an intermediate result is being cached
100 loops, best of 3: 2.56 ms per loop
を
解決策を確認し、出力が異なる場合は、質問に追加することができます。ありがとう。 – jezrael