Соединить фрейм данных с мультииндексным фреймом данных со значениями градиента

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

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

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

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']

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

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

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

ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long long'

TypeError: cannot concatenate object of type "<class 'list'>"; only pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid

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

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

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

ValueError: Buffer dtype mismatch, expected 'Python object' but got '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])

Столбец «Градиент», «значение» правильно добавляется в фрейм данных, но значения снова NaN.

Если ваши данные являются мультииндексными, не публикуйте просто распечатанный текст. Подробнее см. это.

Quang Hoang 19.06.2019 20:57

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

Otto von Hintenwievonvorn 20.06.2019 14:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать 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)
                           )

это сработало, но я не очень понимаю, почему я должен снова сгруппировать его

Otto von Hintenwievonvorn 20.06.2019 18:53

Вы группируете его только один раз, как в моем решении. Причина, по которой ваше решение не сработало, заключается в том, что df имеет другой индекс, чем pd.Series(gradient). Это также причина, по которой мне пришлось указать index=x.index в своем решении.

Quang Hoang 20.06.2019 19:03

Спасибо за объяснение. Еще одна вещь, с которой я все еще борюсь и которая, вероятно, основана на той же проблеме, заключается в том, что я хочу «обнулить» результаты моих измерений на основе первой строки данных для каждой группы «Файл». for x in xls: df[x,('Shear Stress zero [Pa]')] = pd.DataFrame(df.loc[x,('Shear Stress [Pa]')].values[:] - df.loc[x,('Shear Stress [Pa]')].values[0]) Работает частично, но просто дает мне массив с отключенным индексом. Я пытался следовать вашей схеме, чтобы выполнить это, но я получаю KeyError: 'File'

Otto von Hintenwievonvorn 21.06.2019 15:01

на основе вашего решения ранее я использовал: def set_zero(x): zeroShear = x[('Shear Stress [Pa]')] - x[('Shear Stress [Pa]')].values[0] return pd.Series(zeroShear, index = x.index) df_full[('Shear Stress zero [Pa]')] = (df_full.groupby('File', group_keys=False) .apply(set_zero))

Otto von Hintenwievonvorn 21.06.2019 15:07

Другие вопросы по теме

Похожие вопросы

Выбор строк, в которых значение числового столбца меняет знак через openpyxl
Убедитесь, что уникальный экземпляр создается при инициализации объекта класса
Проблема с преобразованием изображения в оттенках серого обратно в изображение rgb с помощью определяемой пользователем функции преобразования в python
Как исправить MOUSEMOTION и избежать неожиданных результатов?
Выберите строку на основе самого высокого значения столбца python
Есть ли способ написать с меньшим «вложением»?
Как зафиксировать время настенных часов и время процессора в переменной Python, используя встроенное «время» bash?
Как посчитать начальный час дня, конечный час дня, среднее количество часов в день в фрейме данных pandas?
Крестики-нолики Min Max Алгоритм Python. Компьютерный алгоритм не надежен
Могу ли я разместить логотип прямо на панели заголовка Gtk? (без виджета)