2016-05-17 2 views

答えて

0

は2可能な解決策があり、それがより良い第一印象の出力です。

私はあなたが列col_1col1_idで作成された辞書dmapが必要だと思う:

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 

それとも、whereisinを使用することができます。

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 
+0

解決策を確認し、出力が異なる場合は、質問に追加することができます。ありがとう。 – jezrael

0

試してみてください。

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']) 
df = df.reset_index() 

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 
0

は、この問題は、RDBMSで標準タスクのように見えるように私には思えます。したがって、merge()を使用することができます

df['col2_id'] = pd.merge(df, df[['col1', 'col1_id']], left_on='col2', right_on='col1', how='left')['col1_id_y'] 
関連する問題