Python 如何在panda中迭代行和多列?

Python 如何在panda中迭代行和多列?,python,pandas,row,Python,Pandas,Row,我有一个数据帧(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

我有一个数据帧(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]})

我知道不推荐使用ItErrors,但我不知道该怎么办

您仍将使用常规循环遍历列,但apply函数是此类行操作的最佳选择。如果要使用来自多个列的信息(这里比较的是某个列和“V1”),可以在数据帧上使用apply并指定轴。如果您只查看一列中的信息(例如,如果V1的值为偶数,则使该列的值加倍),则可以将apply用于一个系列

对于函数的两个版本,您将要传递的参数都是lambda表达式。如果您将其应用于像这里这样的数据帧,
x
表示可以由列索引的行中的值。最后,将结果分配回数据帧中的新列或现有列

假设df_开始和df_结束代表您的计划输入和输出:

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]

您仍将使用常规循环遍历列,但应用函数是此类行操作的最佳选择。如果您要使用多个列的信息(此处您将比较某个列和“V1”),请在数据帧上使用应用并指定轴。如果您只查看一个列的信息(就像制作一个列,如果它们是偶数,则将V1的值加倍,您可以对一个系列使用apply

对于函数的两个版本,您将要传递的参数都是lambda表达式。如果您将其应用于像这里这样的数据帧,
x
表示可以由列索引的行中的值。最后,将结果分配回数据帧中的新列或现有列

假设df_开始和df_结束代表您的计划输入和输出:

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]

您可以使用
掩码

对于单独的数据帧,请使用
分配

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)))


您可以使用
掩码

对于单独的数据帧,请使用
分配

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)))


请共享预期输出
df_end['V2']=df_end['V2'].fillna(df_end['V1']);df_end['V3']=df_end['V3'].fillna(df_end['V1'])
?@Yo\u Chris我认为这与OP要求的正好相反。他们不想填充V1中的空值。他们想替换df\u start列中的值,如果该行的值与V1中的值匹配。请共享预期输出
df\u end['V2']=df\u end['V2'].fillna(df\u end['V1']);df\u end['V3']=df\u end['V3'].fillna(df_end['V1'])
?@Yo\u Chris我认为这与OP要求的正好相反。他们不希望填充V1中的空值。他们希望替换df\u start列中的值,前提是该行的值与V1中的值匹配。尽可能避免应用,与向量化方法相比,它会降低性能ppy如果可能的话,与矢量化方法相比,它的性能会受到影响谢谢。它工作得非常好。为了确保我理解你,首先对每一行df_进行评估,从V2/V3==V1开始,然后在它为真时屏蔽?我不理解区别是什么“**”represents@yyzzz确切地说,
**
也用作将数据帧解压为两列的kwarg谢谢。它工作得很好。为了确保我理解您首先对每行dfu求值,从V2/V3==V1开始,然后在它为真时屏蔽?我不理解区别是什么“**”represents@yyzzz确切地说,
**
也被用作解包数据帧i的kwargnto 2列