Pandas - 列中实例的自引用

时间:2016-10-05 20:37:35

标签: python pandas

我有以下DF

 SampleID ParentID
0  S10        S20    
1  S10        S30    
2  S20        S40     
3  S30              
4  S40       

如何将另一行的ID放在' ParentID'列中?而不是字符串?

预期结果:

 SampleID ParentID 
0  S10        2    
1  S10        3    
2  S20        4   
3  S30              
4  S40              

我发现的最接近这个问题的结果是: How to self-reference column in pandas Data Frame?

2 个答案:

答案 0 :(得分:2)

我认为您可以使用merge,然后指定列index

df1 = pd.merge(df[['SampleID']].reset_index(), 
               df[['ParentID']], 
               left_on='SampleID',
               right_on='ParentID')
print (df1)
   index SampleID ParentID
0      2      S20      S20
1      3      S30      S30
2      4      S40      S40

df['ParentID'] = df1['index']
df.fillna('', inplace=True)
print (df)
  SampleID ParentID
0      S10        2
1      S10        3
2      S20        4
3      S30         
4      S40      

mapdict的另一个解决方案,其中交换键的值为:

d = dict((v,k) for k,v in df.SampleID.iteritems())
print (d)
{'S10': 1, 'S40': 4, 'S20': 2, 'S30': 3}

df.ParentID = df.ParentID.map(d)
df.ParentID.fillna('', inplace=True)
print (df)
  SampleID ParentID
0      S10        2
1      S10        3
2      S20        4
3      S30         
4      S40         

答案 1 :(得分:1)

通过传递要替换的值的映射列表来使用replace

df.ParentID.replace(df.SampleID.tolist(), df.index.tolist(), inplace=True)

df
Out[22]: 
  SampleID  ParentID
0      S10       2.0
1      S10       3.0
2      S20       4.0
3      S30       NaN
4      S40       NaN