我在设定的时间间隔内从一些样本中收集了一些实验数据,这些数据框的组织如下:
Studynumber Time Concentration
1 20 80
1 40 60
1 60 40
2 15 95
2 44 70
2 65 30
虽然时间间隔应该是固定的,但数据会根据实际收集的时间而有所不同。我想创建时间列的分档,计算平均值'浓度,然后比较每个研究数据的实际浓度和平均浓度之间的差异。
为此,我创建了一个名为' roundtime'的列,然后使用groupby来计算平均值:
data['roundtime']=data['Time'].round(decimals=-1)
meanconc = data.groupby('roundtime')['Concentration'].mean()
这给出了大熊猫系列的平均浓度,以循环时间为指标。然后我想把它重新放回主框架来计算每个实际浓度和平均浓度之间的差异:
data['meanconcentration']=meanconc.loc[data['roundtime']].reset_index()['Concentration']
这适用于前60个左右的值,但随后为每个条目返回NaN,我认为因为数据索引长于meanconcentration的索引。
一方面,这看起来像一个索引问题 - 同样地,我可能只是以错误的方式接近这个问题。所以我的问题是:a)这种方法可以工作吗?和b)有另一种/更好的方法吗?欢迎所有建议!
答案 0 :(得分:1)
使用transform
添加groupby
聚合中的列,这将创建一个Series
,其索引与原始df对齐,因此您可以正确分配它:
In [4]:
df['meanconcentration'] = df.groupby('roundtime')['Concentration'].transform('mean')
df
Out[4]:
Studynumber Time Concentration roundtime meanconcentration
0 1 20 80 20 87.5
1 1 40 60 40 65.0
2 1 60 40 60 35.0
3 2 15 95 20 87.5
4 2 44 70 40 65.0
5 2 65 30 60 35.0
答案 1 :(得分:0)
你写
然后我想让它回到主框架来计算每个实际浓度和平均浓度之间的差异
Data Wrangling in Pandas中groupby-apply
的文档中显示了非常相似的内容。请注意,您可以直接计算:
>>> data.groupby('roundtime').apply(
lambda g: g.Concentration - g.Concentration.mean())
roundtime
20 0 -7.5
3 7.5
40 1 -5.0
4 5.0
60 2 5.0
5 -5.0
Name: Concentration, dtype: float64
请注意,您可以轻松地对此应用.reset_index()
,如果您愿意,可将其合并回原始DataFrame等。
另一种方法是计算均值,然后将其直接合并:
pd.merge(
data.groupby('roundtime').mean(),
data,
left_index=True,
right_on='roundtime',
how='right')
(请注意,这会为原始列创建列''Concentration_X'for the mean, and
'Concentration_Y'。)。