Pandas斌数据帧

2024-04-27 01:07:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有深度列的数据帧,网格为0.1米。在

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米的深度频率上存储数据以获得新的数据帧?在

或者更确切地说,对于dz=0.5 m的存储单元,如何平均df1中的列值(每0.1 m有一个数据)?在

关键是要得到相同的df结构,相同的列(350-355),但是对于某个dz间隔(行数),每列的行数应该是平均值/二进制数,比如0.5m

因此,在本例中,我的新dataframe只有两行,深度值分别为1.35和1.85m,每列都与df1中的一样。 第一个为1.1-1.6m层段的平均值,第二个为1.6-2.1m的平均值。在


Tags: 数据import网格dataframepandasindexas频率
3条回答

你只需要定义一个grouper,然后做一个标准的groupby。加倍然后使用整数截断是一种方法。请注意,我还减去了一小部分(sub(0.001)),这样就可以匹配@gehbiszumeis答案的bin边缘,但这只是一个任意的bin边缘决定,可以忽略不计。在

df1['grp'] = df1.depth.sub(0.001).mul(2).astype(int)
df1.groupby('grp').mean()

结果:

^{pr2}$

或者,您可以使用pd.bin方法,比如@gehbiszumeis,它稍微更优雅一些。以下是该方法的一个变体,该方法产生了一个区间指数:

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

请注意,您仍然需要更新“depth”列。另外,groupbyby函数可能会变得更“智能”——根据数据帧计算出自动使用的深度。。。在

使用df.groupbypd.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]

给予

^{pr2}$

其中每行中有35x列的平均值,1 < x <= 1.51.5 < x <= 2等。。。在

通过为step变量选择所需的值,可以轻松地更改重新定局。在

相关问题 更多 >