
[英]apply function on subset of dataframe rows in column based on value in other column
[英]Iterate through rows in a dataframe and change value of a column based on other column
假设我有一个称为df的数据帧,看起来像下面所示的数据帧:
Id Place
1 NY
2 Berlin
3 Paris
4 Paris
5 Berlin
还有一个字典,其ID为键,位置为值,如下所示:
id_to_place = { 1 : "Berlin", 2: "Berlin", 3: "NY"}
我想遍历数据帧的每一行,看看ID_to_place词典中是否包含ID。 如果是这样,那么我想用字典值替换该行的Place列。 例如在runninh之后,我希望输出的代码是:
Id Place
1 Berlin
2 Berlin
3 NY
4 Paris
5 Berlin
到目前为止,我已经尝试了以下代码:
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)
但是,当我运行代码时,数据框保持不变。 有谁知道为什么会这样吗? 感谢您的帮助!
使用Series.map
替换匹配的值,然后用Series.fillna
的原始列替换NaN
:
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
您当前的方法不起作用,因为字典中的项目是整数,并且您正在根据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)
您可以根据您的字典构建一个DataFrame,以向量化的方式分配值:
df1 = pd.DataFrame(list(id_to_place.values()), index=id_to_place.keys(),
columns=['Place'])
df.set_index('Id', inplace=True)
df.loc[df1.index] = df1.Place
df.reset_index(inplace=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.