Как изменить фрагмент кадра данных pandas за фрагментом?

По сути, я хочу работать с кадром данных pandas по одному фрагменту за раз, и я хочу, чтобы изменения в этом фрагменте отражались в исходном кадре данных. Например, в следующем коде я беру часть df, которая равна sub_df, а затем часть того, что есть sub_sub_df. Теперь я хочу внести изменения в sub_sub_df и хочу, чтобы эти изменения снова отразились в df.

df = pd.DataFrame()
df['a'] = np.random.choice([0,1,2,3,4,5], size=100)
df['b'] = np.random.choice([-1,+1], size=100)
df['out'] = np.zeros(shape=(100,))

for i in [0,3,4]:
    sub_df = df[df.a == i]
    for j in [-1,+1]:
        sub_sub_df = sub_df[sub_df.b == j]
        sub_sub_df.out = np.random.normal()
df.head()

Это показывает, что столбец «c» df по-прежнему равен нулю, и изменения, которые я сделал для sub_sub_df, не распространяются обратно.

1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

обновленный код ниже должен работать, я думаю

import pandas as pd
import numpy as np

df = pd.DataFrame()
df['a'] = np.random.choice([0,1,2,3,4,5], size=100)
df['b'] = np.random.choice([-1,+1], size=100)
df['out'] = np.zeros(shape=(100,))

for i in [0,3,4]:
    sub_df = df[df.a == i]
    for j in [-1,+1]:
        sub_sub_df = sub_df[sub_df.b == j]
        index_ = sub_sub_df.index
        df.loc[index_, 'out'] = np.random.normal()
df.head()

Вот способ, который отслеживает минимальный индекс на каждом шаге:

for i in [0,3,4]:
    sub_idx = df.index[df.a == i]
    for j in [-1,+1]:
        sub_sub_idx = sub_idx[df.loc[sub_idx, 'b'] == j]
        df.loc[sub_sub_idx, 'out'] = np.random.normal()

Другие вопросы по теме