【问题标题】:Concat dataframe to multi index dataframe with gradient values将数据帧连接到具有梯度值的多索引数据帧
【发布时间】:2019-11-02 13:52:31
【问题描述】:

我有一个包含多个测试结果值的多索引数据框。 为了进一步的数据分析,我想将推导添加到数据框中。

我尝试在对数据框进行分组后直接通过 lambda 函数计算它。由于采样中的噪声,需要分组(平均值)。 稍后我想从我的数据框中删除导数为<= 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]

现在我想将渐变连接到轴 = 1 上的 df,标题可以是 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: 缓冲区 dtype 不匹配,预期为“Python 对象”,但得到了 '长长'

TypeError: 无法连接类型为“”的对象;只要 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 有效

我还假设有一种更简单的方法可以使用 lambda 函数完成此操作,然后将其应用到位。

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' 列已正确添加到数据框中,但值再次为 NaN

【问题讨论】:

  • 如果你的数据是多索引的,不要只发布打印出来的文本。详情请见this
  • Quang,很抱歉,请查看更新后的示例数据框。

标签: python-3.x pandas numpy dataframe concat


【解决方案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)
                           )

【讨论】:

  • 它成功了,但我真的不明白为什么我必须再次对其进行分组
  • 在我的解决方案中,您只需将其分组一次。您的解决方案不起作用的原因是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))
猜你喜欢
  • 2021-01-12
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2021-12-13
  • 1970-01-01
  • 2020-10-21
相关资源
最近更新 更多