панды берут в среднем по нечетным рядам - PullRequest
0 голосов
/ 29 сентября 2018

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

начальные данные:

   time value value_1  value-2
0   0    0      4        3
1   2    1      6        6

промежуточный df:

   time value value_1  value-2
0   0    0      4        3
1   1    0      4        3     #duplicate of row 0
2   2    1      6        6
3   3    1      6        6     #duplicate of row 2

Я хотел бы создать df_1:

   time value value_1  value-2
0   0    0      4        3
1   1    0.5    5        4.5     #average of row 0 and 2
2   2    1      6        6
3   3    2      8        8       #average of row 2 and 4

К этому я добавил копию начального кадра данных, чтобы создать промежуточный кадр данных, показанный выше:

df = df_0.append(df_0)
df.sort_values(['time'], ascending=[True], inplace=True)
df = df.reset_index()
df['value_shift'] = df['value'].shift(-1)
df['value_shift_1'] = df['value_1'].shift(-1)
df['value_shift_2'] = df['value_2'].shift(-1)

тогда я думал о применении функции к каждому столбцу:

def average_vals(numeric_val):
    #average every odd row
    if int(row.name) % 2 != 0:
        #take average of value and value_shift for each value
        #but this way I need to create 3 separate functions

Есть ли способ сделать это без написания отдельной функции для каждого столбца и применения к каждому столбцу один за другим (в действительностиданные у меня десятки столбцов)?

1 Ответ

0 голосов
/ 29 сентября 2018

Как насчет этого метода с использованием DataFrame.reindex и DataFrame.interpolate

df.reindex(np.arange(len(df.index) * 2) / 2).interpolate().reset_index(drop=True)

Пояснение

Переиндексация, в полшага reindex(np.arange(len(df.index) * 2) / 2)

Это дает DataFrame следующим образом:

     time  value  value_1  value-2
0.0   0.0    0.0      4.0      3.0
0.5   NaN    NaN      NaN      NaN
1.0   2.0    1.0      6.0      6.0
1.5   NaN    NaN      NaN      NaN

Затем используйте DataFrame.interpolate, чтобы заполнить NaN значения .... по умолчанию будет линейная интерполяция, поэтому среднее значение вв этом случае.

Наконец, используйте .reset_index(drop=True) для исправления индекса.

Должно дать

   time  value  value_1  value-2
0   0.0    0.0      4.0      3.0
1   1.0    0.5      5.0      4.5
2   2.0    1.0      6.0      6.0
3   2.0    1.0      6.0      6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...