为了账号安全,请及时绑定邮箱和手机立即绑定

从数据框中查找/搜索值以创建新列

从数据框中查找/搜索值以创建新列

浮云间 2022-05-24 15:36:12
我正在尝试根据从其他列和行中搜索数据在数据框中创建新列。计算此类列值的最佳/禁食方法是什么。我尝试过使用 lambda 和外部函数,但没有结果。有人可以详细说明获得最终结果的方法以及从计算时间来看哪种方法是最佳的。我们可以分配函数/lambda 来计算这些值吗?我们可以实现数据框,它会保持引用函数计算列中的值而不是计算值本身吗?基于其他列/行中的数据的动态结果。data = {             'ID':[1, 2, 3, 4 ,5],                              'Name':['Andy', 'Rob', 'Tony', 'John', 'Lui'],            'M_Name':['Lui', 'Lui', 'Lui','NoData', 'John']             } df = pd.DataFrame(data) Original DataFrame:    ID  M_Name  Name0   1     Lui  Andy1   2     Lui   Rob2   3     Lui  Tony3   4  NoData  John4   5    John   Luidata_after = {             'ID':[1, 2, 3, 4 ,5],                              'Name':['Andy', 'Rob', 'Tony', 'John', 'Lui'],            'M_Name':['Lui', 'Lui', 'Lui','NoData', 'John'],                'ID_by_M_Name':[5, 5, 5, 'NoData', '4']             } df1 = pd.DataFrame(data_after)Processed DataFrame:    ID ID_by_M_Name  M_Name  Name0   1          5     Lui  Andy1   2          5     Lui   Rob2   3          5     Lui  Tony3   4     NoData  NoData  John4   5          4    John   LuiI have tried two ways to get ID but not sure how to use them in assigngetID = lambda name: df.loc[df['Name'] == name]['ID'].iloc[0]def mID(name):    return df.loc[df['Name'] == name]['ID'].iloc[0]For each row we want to find ID of M_Name for specifc Name. e.g. for Name='Andy' we have M_Name = 'Lui' and Lui's ID(5)For Lui M_name is John and John's ID is 4print(getID('Lui'))print(mID('Lui'))df['ID'] = df.assign(mID(df['M_Name']), axis=1 )IndexError:单个位置索引器超出范围
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

使用Series.replaceor :Series.map_Series.fillna


df['ID_by_M_Name'] = df['M_Name'].replace(df.set_index('Name')['ID'])

#assign alternative

#df = df.assign(ID_by_M_Name = df['M_Name'].replace(df.set_index('Name')['ID']))

df['ID_by_M_Name'] = df['M_Name'].map(df.set_index('Name')['ID']).fillna(df['M_Name'])

#assign alternative

#df=df.assign(ID_by_M_Name=df['M_Name'].map(df.set_index('Name')['ID']).fillna(df['M_Name']))

print (df)


   ID  Name  M_Name ID_by_M_Name

0   1  Andy     Lui            5

1   2   Rob     Lui            5

2   3  Tony     Lui            5

3   4  John  NoData       NoData

4   5   Lui    John            4

如果新列的重要位置使用DataFrame.insert:


df.insert(1, 'ID_by_M_Name', df['M_Name'].replace(df.set_index('Name')['ID']))

print (df)


   ID ID_by_M_Name  Name  M_Name

0   1            5  Andy     Lui

1   2            5   Rob     Lui

2   3            5  Tony     Lui

3   4       NoData  John  NoData

4   5            4   Lui    John


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信