Не могу присвоить значение ячейке в мультииндексном фрейме данных (присвоение копии / слайсу df?) - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь присвоить значение (среднее значение в другом столбце) ячейке в многоиндексном фрейме данных Pandas, для которого я выполняю итерацию для вычисления средних значений по движущемуся окну в другом столбце. Но когда я пытаюсь присвоить значение, оно не меняется.

Я не привык работать с мультииндексами и решил несколько других проблем, но на данный момент я озадачен ...

Игрушечный код, который воспроизводит проблему:

tuples = [
    ('AFG', 1963), ('AFG', 1964), ('AFG', 1965), ('AFG', 1966), ('AFG', 1967), ('AFG', 1968),
    ('BRA', 1963), ('BRA', 1964), ('BRA', 1965), ('BRA', 1966), ('BRA', 1967), ('BRA', 1968)
    ]
index = pd.MultiIndex.from_tuples(tuples)
values = [[12, None], [0, None],
          [12, None], [0, 4], 
          [12, 5], [0, 4], 
          [12, 2], [0, 4], 
          [12, 2], [0, 4], 
          [1, 4], [7, 1]]
df = pd.DataFrame(values, columns=['Oil', 'Pop'], index=index)
lag =-2
lead=0
indicator = 'Pop'
new_indicator = 'Mean_pop'
df[new_indicator] = np.nan
df

Дает:

               Oil  Pop Mean_pop
AFG     1963    12  NaN NaN
        1964    0   NaN NaN
        1965    12  NaN NaN
        1966    0   4.0 NaN
        1967    12  5.0 NaN
        1968    0   4.0 NaN
BRA     1963    12  2.0 NaN
        1964    0   4.0 NaN
        1965    12  2.0 NaN
        1966    0   4.0 NaN
        1967    1   4.0 NaN
        1968    7   1.0 NaN

Затем выполнить итерацию по df:

for country, country_df in df.groupby(level=0):
    oldestyear = country_df[indicator].first_valid_index()[1]
    latestyear =  country_df[indicator].last_valid_index()[1]
    for t in range(oldestyear, latestyear+1):
        print (country, oldestyear, latestyear, t)
        print ("  For",  country, ", calculate mean over ", t+lag, "to", t+lead, 
               "and add to row for year", t)
        dftt = country_df.loc[(country, t+lag):(country, t+lead)]
        print(dftt[indicator])
        mean = dftt[indicator].mean(axis=0)
        print("mean for ", indicator, "in", country, "during", t+lag, "to", t+lead, "is", mean)
        df.loc[country, t][new_indicator] = mean

Диагностический вывод не вставлен, но df выглядит так же после итерации, и я получаюследующее предупреждение на некоторых итерациях:

A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if sys.path[0] == '':

Любые указатели будут с благодарностью.

1 Ответ

1 голос
/ 10 ноября 2019

Я думаю, что это просто, если установить в последней строке:

df.loc[(country, t), new_indicator] = mean
...