我有一个数据帧(df1),如果列V2和V3的值与V1相同,我想替换它们。
import pandas as pd
import numpy as np
df_start= pd.DataFrame({"ID":[1, 2 , 3 ,4, 5], "V1":[10,5,15,20,20], "V2":[10,5,20,17,15], "V3":[10, 25, 15, 10, 20]})
df_end = pd.DataFrame({"ID":[1, 2 , 3 ,4, 5], "V1":[10,5,15,20,20], "V2":[np.nan,np.nan,20,17,15], "V3":[np.nan, 25, np.nan, 10, np.nan]})
我知道不推荐使用iterrows,但是我不知道该怎么做。
答案 0 :(得分:0)
您仍将使用常规循环遍历各列,但是apply函数是此类行操作的最佳朋友。如果要使用不止一列的信息(此处要比较某些列和“ V1”),请在DataFrame上使用Apply并指定轴。如果您只查看一个列中的信息(例如创建一个使V1中的值即使是偶数也翻倍的列),则可以仅对系列使用apply。
对于函数的两个版本,您要传递的参数都是lambda表达式。如果应用它,就像在这里一样执行DataFrame,则x
表示可以被列索引的行中的值。最后,将结果分配回DataFrame中的新列或现有列。
假设df_start和df_end代表您计划的输入和输出:
cols = ["V2","V3"]
for col in cols:
df_start[col] = df.apply(lambda x[col] if x[col] != x["V1"] else np.nan, axis=1]
答案 1 :(得分:0)
您可以使用mask
:
对于单独的数据帧,请使用assign
:
df_end = df_start.assign(**df_start[['V2','V3']]
.mask(df_start[['V2','V3']].eq(df_start['V1'],axis=0)))
要修改输入数据框,只需就地分配:
df_start[['V2','V3']] = (df_start[['V2','V3']]
.mask(df_start[['V2','V3']].eq(df_start['V1'],axis=0)))
ID V1 V2 V3
0 1 10 NaN NaN
1 2 5 NaN 25.0
2 3 15 20.0 NaN
3 4 20 17.0 10.0
4 5 20 15.0 NaN