将数据帧连接到具有梯度值的多索引数据帧
Concat dataframe to multi index dataframe with gradient values
我有一个包含多个测试结果值的 Multi-index 数据框。
为了进一步的数据分析,我想将推导添加到数据框。
我尝试在对数据帧进行分组后直接通过 lambda 函数计算它。由于采样中的噪声,需要分组(平均值)。
稍后我想从我的数据框中删除导数为 <= 0
.
的行
简化的 Multi-index 数据框如下所示:
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]
现在我想在 axis = 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
下一步将是 remove/drop ['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
我还假设有一种更简单的方法可以使用 lambda 函数完成此操作,只需将其应用到位即可。
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])
'Gradient'、'value' 列已正确添加到数据框中,但值再次为 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)
)
我有一个包含多个测试结果值的 Multi-index 数据框。 为了进一步的数据分析,我想将推导添加到数据框。
我尝试在对数据帧进行分组后直接通过 lambda 函数计算它。由于采样中的噪声,需要分组(平均值)。
稍后我想从我的数据框中删除导数为 <= 0
.
简化的 Multi-index 数据框如下所示:
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]
现在我想在 axis = 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
下一步将是 remove/drop ['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
我还假设有一种更简单的方法可以使用 lambda 函数完成此操作,只需将其应用到位即可。
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])
'Gradient'、'value' 列已正确添加到数据框中,但值再次为 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)
)