我有一个熊猫数据框,如下所示:
df =pd.DataFrame({'String':['JAIJAOD','ERJTD','AJDIDO','AJDIDO'],'Position':[5,2,nan,4]})
我正在尝试获取第三列,该列显示代表列位置中数字的第一列的字母是什么。数据框应该类似于
df = pd.DataFrame({'String':['JAIJAOD','ERJTD','AJDIDO','AJDIDO'],'Position':[5,2,nan,4],'Letter':['O','J',nan,'D']})
我已经尝试了以下代码,但是,输出并不是我想要的,因为最终表格在第三列方面存在一些错误。
third = []
for i, n in zip(df['String'],df['Position']):
if n >0: #I thought it because the column Position have just floats
third.append(i[int(n)]
else:
third.append(np.nan)
df['Third'] = pd.Series(third)
答案 0 :(得分:2)
让我们试试
df['Letter'] = [x[int(y)] if y==y else np.nan for x , y in zip(df.String,df.Position) ]
['O', 'J', nan, 'D']
答案 1 :(得分:0)
您可以同时将 lambda x:
函数应用于所需的输入列,方法是应用于数据框,将 x
传递给数据框和 axis=1
。对于每一行,我的方法根据 String
列中的相应值对 Position
中的每个值进行切片:
df =pd.DataFrame({'String':['JAIJAOD','ERJTD','AJDIDO','AJDIDO'],'Position':[5,2,np.nan,4]})
df['Letter'] = df[df['Position'].notnull()].apply(lambda x: x['String'][int(x['Position'])],axis=1)
df
Out[1]:
String Position Letter
0 JAIJAOD 5.0 O
1 ERJTD 2.0 J
2 AJDIDO NaN NaN
3 AJDIDO 4.0 D