Как перебирать строки и несколько столбцов в panda? - PullRequest
1 голос
/ 22 апреля 2020

У меня есть фрейм данных (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 голосов
/ 22 апреля 2020

Вы можете использовать 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
0 голосов
/ 22 апреля 2020

Вы по-прежнему будете использовать обычные значения от l oop до go через столбцы, но функция apply - ваш лучший друг для такого рода операций со строками. Если вы собираетесь использовать информацию из более чем одного столбца (здесь вы сравниваете некоторый столбец и «V1»), вы используете apply в DataFrame и задаете ось. Если вы просматривали информацию только из одного столбца (например, создавая столбец, который удваивает значения от V1, если они четные, вы можете использовать apply только с Series.

Для обеих версий функции аргумент вы собираетесь передать это лямбда-выражение. Если вы примените его, сделайте 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...