По сути, я хочу работать с кадром данных 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
, не распространяются обратно.
обновленный код ниже должен работать, я думаю
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()