如何遍历熊猫中的行和多列?

时间:2020-04-22 16:14:28

标签: 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":[10,5,15,20,20], "V2":[np.nan,np.nan,20,17,15], "V3":[np.nan, 25, np.nan, 10, np.nan]})

我知道不推荐使用iterrows,但是我不知道该怎么做。

2 个答案:

答案 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