我有一个深度框为0.1 m的数据框。
import pandas as pd
df1 = pd.DataFrame({'depth': [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1 ],
'350': [7.898167, 6.912074, 6.049002, 5.000357, 4.072320, 3.070662, 2.560458, 2.218879, 1.892131, 1.588389, 1.573693],
'351': [8.094912, 7.090584, 6.221289, 5.154516, 4.211746, 3.217615, 2.670147, 2.305846, 1.952723, 1.641423, 1.622722],
'352': [8.291657, 7.269095, 6.393576, 5.308674, 4.351173, 3.364569, 2.779837, 2.392813, 2.013316, 1.694456, 1.671752],
'353': [8.421007, 7.374317, 6.496641, 5.403691, 4.439815, 3.412494, 2.840625, 2.443868, 2.069017, 1.748445, 1.718081 ],
'354': [8.535562, 7.463452, 6.584512, 5.485725, 4.517310, 3.438680, 2.890678, 2.487039, 2.123644, 1.802643, 1.763818 ],
'355': [8.650118, 7.552586, 6.672383, 4.517310, 4.594806, 3.464867, 2.940732, 2.530211, 2.178271, 1.856841, 1.809555 ]},
index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
)
我的问题是:如何对数据进行装箱,以在0.5 m的深度频率上获得一个新的数据帧?
或者,对于dz = 0.5 m的仓位,我如何平均df1的列值(每0.1 m有数据)?
关键是要获得相同的df结构,相同的列(350-355),但是应该在一定的dz间隔(行数)下,将每列的行平均/合并,比如说0.5 m
因此,在这种情况下,我的新数据框将只有两行,深度值为1.35和1.85 m,每一列都保持在df1中。 第一个是1.1-1.6m区间的平均值,第二个是1.6-2.1m区间的平均值。
答案 0 :(得分:4)
结合使用df.groupby
和pd.cut
import pandas as pd
import numpy as np
# Specifiy your desired dz step size
step = 0.5
dz = np.arange(1,3,step)
# rebin dataframe
df2 = df1.groupby(pd.cut(df1.depth, dz, labels=False), as_index=False).mean()
# refill 'depth' column
df2.depth = dz[:-1]
给予
depth 350 351 352 353 354 355
0 1.0 5.986384 6.154609 6.322835 6.427094 6.517312 6.397441
1 1.5 2.266104 2.357551 2.448998 2.502890 2.548537 2.594184
2 2.0 1.573693 1.622722 1.671752 1.718081 1.763818 1.809555
每行中的35x
,1 < x <= 1.5
等中的1.5 < x <= 2
列的均值...
您可以通过为step
变量选择所需的值来轻松地更改重新绑定。
答案 1 :(得分:2)
您只需要定义一个分组器,然后进行标准分组。加倍然后使用整数截断是一种方法。请注意,我还减去了一小部分(sub(0.001)
),以便与@gehbiszumeis答案的bin边缘相匹配-但这只是一个任意bin边缘的决定,可以省略。
df1['grp'] = df1.depth.sub(0.001).mul(2).astype(int)
df1.groupby('grp').mean()
结果:
depth 350 351 352 353 354 355
grp
2 1.3 5.986384 6.154609 6.322835 6.427094 6.517312 6.397441
3 1.8 2.266104 2.357551 2.448998 2.502890 2.548537 2.594184
4 2.1 1.573693 1.622722 1.671752 1.718081 1.763818 1.809555
或者,您可以使用{@ {1}}这样的方法,例如@gehbiszumeis,它稍微优雅一些。这是该方法的一种变体,它会导致间隔索引:
pd.bin
答案 2 :(得分:1)
那这样的事情呢?
df1['depth_range'] = pd.cut( df1.depth, pd.interval_range(start=1.0,end=2.5,freq=0.5) )
df1.groupby('depth_range').mean()
depth 350 351 352 353 354 355
depth_range
(1.0, 1.5] 1.3 5.986384 6.154609 6.322835 6.427094 6.517312 6.397441
(1.5, 2.0] 1.8 2.266104 2.357551 2.448998 2.502890 2.548537 2.594184
(2.0, 2.5] 2.1 1.573693 1.622722 1.671752 1.718081 1.763818 1.809555
请注意,您仍然需要更新“深度”列。同样,可以将In [33]: g = df1.groupby(by=lambda i: 1.35 if i < 1.7 else 1.85)
In [34]: g.mean()
Out[34]:
350 351 352 353 354 355 depth
1.35 7.898167 8.094912 8.291657 8.421007 8.535562 8.650118 1.10
1.85 3.493796 3.608861 3.723926 3.794699 3.855750 3.811756 1.65
的{{1}}函数设置为“更智能”-根据数据框找出要自动使用的深度...