Pandas DataFrame: Почему я не могу изменить значение одного столбца на основе значения другого через итерацию строки? - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу изменить значение одного столбца на основе этого значения другого.Например, учитывая следующее DF:

   Freq TOC
1    10  NA
2    20  NA
3    30  NA

for index, row in df.iterrows():
    if row["Freq"] == 20:
        row["TOC"] = True

Я бы ожидал:

   Freq TOC
1    10  NA
2    20  True
3    30  NA

Но ничего не изменилось.В чем дело?Благодарю.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

pd.DataFrame.iterrows возвращает ряд для каждой строки в цикле уровня Python, а не динамические ссылки на ваш фрейм данных.Более эффективно, вы можете использовать векторизованные методы по столбцам вместо цикла по строкам (это предполагает, что вы довольны 1 == True):

df['TOC'] = np.where(df['Freq'] == 20, True, np.nan)

Более идиоматическим является присвоение логических рядов, т.е. True / False только значения:

df['TOC'] = df['Freq'] == 20

Что бы сработало, используя индекс в вашем цикле, хотя это будет неэффективно:

for index, row in df.iterrows():
    if row['Freq'] == 20:
        df.loc[index, 'TOC'] = True
0 голосов
/ 25 ноября 2018

Вы изменяете «копию» строки, а не саму строку.

В общем случае не следует использовать циклы для изменения кадров данных.Вместо этого прибегайте к векторизованным операциям:

df.loc[df["Freq"]==20, "TOC"] = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...