Конкат данных с мультииндексных данных со значениями градиента - PullRequest
0 голосов
/ 19 июня 2019

У меня есть многоиндексный фрейм данных с несколькими значениями результатов теста.Для дальнейшего анализа данных я хочу добавить деривацию к фрейму данных.

Я попытался вычислить его с помощью лямбда-функции непосредственно после того, как сгруппировал фрейм данных.Группировка (средние значения) требуется из-за шума в выборке.Позже я хочу удалить строки из моих фреймов данных, где производная <= 0. </p>

Упрощенный мультииндексный фрейм данных выглядит следующим образом:

arrays = [['LS13', 'LS13', 'LS13', 'LS13','LS14','LS14','LS14','LS14','LS14','LS14','LS14','LS14'],[0, 2, 2.5, 3,0,2,5,5.5,6,6.5,7,7.5]]
index = pd.MultiIndex.from_arrays(arrays, names=('File', 'Flow Rate Setpoint [l/s]'))
df = pd.DataFrame({('Flow Rate [l/s]','mean') : [-0.057,2.089,2.496,3.011,0.056,2.070,4.995,5.519,6.011,6.511,7.030,7.499],('Time [s]','mean') : [42.225,104.909,165.676,226.446,42.225,104.918,469.560,530.328,591.100,651.864,712.660,773.034],('Shear Stress [Pa]','mean') : [-0.698,5.621,7.946,11.278,-0.774,6.557,40.610,48.370,54.685,58.414,58.356,56.254]},index=index)

, если я запускаю свой код:

import numpy as np

xls = ['LS13', 'LS14']

gradient = [pd.Series(np.gradient(df.loc[(i),('Shear Stress [Pa]','mean')],df.loc[(i),('Time [s]','mean')])) for i in xls]

теперь я хочу объединить градиент в df по оси = 1, заголовок может быть df ['Gradient''values'].

Так что мой pd.Series выглядит так:

    Gradient
     values

0   0.100808
1   0.069048
2   0.04654
3   0.054801
0   0.116941
1   0.087431
2   0.149521
3   0.115805
4   0.082639
5   0.030213
6   -0.017938
7   -0.034806

Следующим шагом будет удаление / удаление строк, где ['Gradient', 'values'] <= 0, в моем примере ['LS14', '7': '7.5'] </p>

Когда я пытался объединить и Dataframe df, и Градиент серии (я знаю, что индексы разные)

merged = pd.concat([pd.DataFrame(df),pd.Series(gradient)], axis=1 , ignore_index = True)

Обычно ошибки имеют одно из следующих значений:

ValueError: Несоответствие буфера dtype, ожидаемый «объект Python», но получено «long long»

TypeError: невозможно объединить объект типа "";действительны только объекты pd.Series, pd.DataFrame и pd.Panel (не рекомендуется)

Я также предположил бы, что существует более простой способ сделать это с помощью лямбда-функции и просто применить ее вplace.

merged = pd.concat([df, pd.Series([gradient], name=('Gradient','value'))], axis=1)

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

ValueError: Несоответствие буфера dtype, ожидаемый объект Python, но получен'long long'

, когда я пытаюсь:

df[("Gradient","value")] =pd.Series([pd.Series(np.gradient(df.loc[(i),('Shear Stress [Pa]','mean')],df.loc[(i),('Time [s]','mean')])) for i in xls])

Столбец 'Gradient', 'value' get корректно добавляется в кадр данных, но значения снова NaN

1 Ответ

0 голосов
/ 20 июня 2019

Вы можете попробовать groupby().apply():

def get_gradients(x):
    gradients = np.gradient(x[('Shear Stress [Pa]', 'mean')],x[('Time [s]', 'mean')] )
    return pd.Series(gradients, index=x.index)

df[('Gradient','Value')] = (df.groupby('File', group_keys=False)
                              .apply(get_gradients)
                           )
...