У меня есть следующий фрейм данных:

a = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]], columns=['a','b','c'])
a
Out[234]: 
    a   b   c
0   1   2   3
1   4   5   6
2   7   8   9
3  10  11  12

Я хочу добавить столбец только с последней строкой в качестве среднего значения последних 2 значений столбца c. Что-то вроде:

    a   b   c   d
0   1   2   3  NaN
1   4   5   6  NaN
2   7   8   9  NaN
3  10  11  12 mean(9,12)

Я пробовал это, но первая часть выдает ошибку:

a['d'].iloc[-1] = a.c.iloc[-2:].values.mean()
3
mobelahcen 4 Июл 2019 в 17:49

2 ответа

Лучший ответ

Вы можете установить столбец d заранее (для обеспечения назначения):

In [100]: a['d'] = np.nan

In [101]: a['d'].iloc[-1] = a.c.iloc[-2:].mean()

In [102]: a
Out[102]: 
    a   b   c     d
0   1   2   3   NaN
1   4   5   6   NaN
2   7   8   9   NaN
3  10  11  12  10.5
2
RomanPerekhrest 4 Июл 2019 в 14:55

Вы можете использовать .at назначить для одной пары меток строки / столбца:

ix = a.shape[0]
a.at[ix-1,'d'] = a.loc[ix-2:ix, 'c'].values.mean()

    a   b   c     d
0   1   2   3   NaN
1   4   5   6   NaN
2   7   8   9   NaN
3  10  11  12  10.5

Также обратите внимание, что цепная индексация (что вы делаете с a.c.iloc[-2:]) явно не рекомендуется в документах, учитывая, что pandas рассматривает эти операции как отдельные события, а именно два отдельных вызова __getitem__, а не как один вызов с использованием вложенного набора фрагментов.

3
yatu 4 Июл 2019 в 14:58