У меня есть мультииндексный фрейм данных с несколькими значениями результатов теста. Для дальнейшего анализа данных я хочу добавить вывод в фрейм данных.
Я попытался либо вычислить его с помощью лямбда-функции сразу после того, как сгруппировал фрейм данных. Группировка (средние значения) требуется из-за шума в выборке.
Позже я хочу удалить строки из своих фреймов данных, где производная равна <= 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
.
Куанг, приношу свои извинения, посмотрите обновленный пример фрейма данных.
Вы можете попробовать 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)
)
это сработало, но я не очень понимаю, почему я должен снова сгруппировать его
Вы группируете его только один раз, как в моем решении. Причина, по которой ваше решение не сработало, заключается в том, что df
имеет другой индекс, чем pd.Series(gradient)
. Это также причина, по которой мне пришлось указать index=x.index
в своем решении.
Спасибо за объяснение. Еще одна вещь, с которой я все еще борюсь и которая, вероятно, основана на той же проблеме, заключается в том, что я хочу «обнулить» результаты моих измерений на основе первой строки данных для каждой группы «Файл». 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'
на основе вашего решения ранее я использовал: 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))
Если ваши данные являются мультииндексными, не публикуйте просто распечатанный текст. Подробнее см. это.