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

我正在尝试根据从其他列和行中搜索数据在数据框中创建新列。计算此类列值的最佳/禁食方法是什么。

我尝试过使用 lambda 和外部函数,但没有结果。

  1. 有人可以详细说明获得最终结果的方法以及从计算时间来看哪种方法是最佳的。

  2. 我们可以分配函数/lambda 来计算这些值吗?

  3. 我们可以实现数据框,它会保持引用函数计算列中的值而不是计算值本身吗?基于其他列/行中的数据的动态结果。

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  Name

0   1     Lui  Andy

1   2     Lui   Rob

2   3     Lui  Tony

3   4  NoData  John

4   5    John   Lui


data_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  Name

0   1          5     Lui  Andy

1   2          5     Lui   Rob

2   3          5     Lui  Tony

3   4     NoData  NoData  John

4   5          4    John   Lui


I have tried two ways to get ID but not sure how to use them in assign


getID = 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 4


print(getID('Lui'))

print(mID('Lui'))


df['ID'] = df.assign(mID(df['M_Name']), axis=1 )

IndexError:单个位置索引器超出范围


浮云间
浏览 122回答 1
1回答

森栏

使用Series.replaceor :Series.map_Series.fillnadf['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_Name0   1  Andy     Lui            51   2   Rob     Lui            52   3  Tony     Lui            53   4  John  NoData       NoData4   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_Name0   1            5  Andy     Lui1   2            5   Rob     Lui2   3            5  Tony     Lui3   4       NoData  John  NoData4   5            4   Lui    John
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python