遍历数据框中的行并根据其他列更改列的值

mar*_*rio 3 python dataframe pandas

假设我有一个名为df的数据,如下所示:

Id      Place        
1        NY        
2       Berlin          
3       Paris        
4       Paris         
5       Berlin       
Run Code Online (Sandbox Code Playgroud)

还有一个字典,它以 ID 为键,以位置为值,如下所示:

id_to_place = { 1 : "Berlin", 2: "Berlin", 3: "NY"}
Run Code Online (Sandbox Code Playgroud)

我想遍历数据帧的每一行,看看 ID 是否包含在id_to_place字典中。如果是这样,那么我想用字典值替换该行的列Place。例如,在 runninh 之后,我希望输出的代码是:

Id      Place        
1       Berlin       
2       Berlin          
3       NY        
4       Paris         
5       Berlin       
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过这段代码:

id_to_place = { 1 : "Berlin", 2: "Berlin", 3: "NY"}

for index,row in df.iterrows():
    id = row['id']
    place = row['place']
    for item in id_to_place:
        if item == str(id):
          df.loc[df.id =id,'place'] = id_to_place[item]

print(df)
Run Code Online (Sandbox Code Playgroud)

但是当我运行代码时,数据框保持不变。有没有人知道为什么会发生这种情况?我感谢任何帮助!

jez*_*ael 5

使用Series.map方法为更换匹配的值,然后替换NaN由原始列S Series.fillna

df['Place'] = df['Id'].map(id_to_place).fillna(df['Place'])
print (df)
   Id   Place
0   1  Berlin
1   2  Berlin
2   3      NY
3   4   Paris
4   5  Berlin
Run Code Online (Sandbox Code Playgroud)


小智 3

您当前的方法不起作用,因为字典中的项目是整数,并且您正在对照 str(id) 检查它们,它总是返回 False。如果您删除 str 并仅根据 id 检查项目,那么它就可以工作。

id_to_place = { 1 : "Berlin", 2: "Berlin", 3: "NY"}

for index,row in df.iterrows():
    id = row['id']
    place = row['place']
    for item in id_to_place:
        if item == id: # this line changed
          df.loc[df.id =id,'place'] = id_to_place[item]

print(df)
Run Code Online (Sandbox Code Playgroud)