用大Pandas按间隔划分长度(米)数据

2024-06-02 11:10:19 发布

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

我有一个长度间隔数据(来自钻孔)的数据帧,如下所示:

df
Out[46]: 
   from  to  min intensity
0     0  10   py        2
1     5  15  cpy       3.5
2    14  27  spy       0.7

我需要透视这些数据,但也要在最小公共长度间隔上断开它;结果是“min”列作为列标题,而值是“rank”。输出如下所示:

^{pr2}$

因此,基本上“从”和“到”描述了钻孔下的非重叠层段,其中间隔被最小公分母分开-正如你所见,原始表格中的“py”间隔被拆分,第一个(0-5m)被拆分成py:2,cpy:0和第二个(5-10米)进入py:2,cpy:3.5。在

一个基本的pivot_table函数的结果是:

pd.pivot_table(df, values='intensity', index=['from', 'to'], columns="min", aggfunc="first", fill_value=0)
Out[48]: 
min      cpy  py  spy
from to              
0    10    0   2    0
5    15  3.5   0    0
14   27    0   0    0.75

它只将from和to列组合成一个索引。重要的一点是,我的输出不能有重叠的from和to值(即后面的“from”值不能小于前一个“to”值)。在

有没有一种优雅的方法可以利用熊猫来实现这一点?谢谢你的帮助!在


Tags: to数据frompy标题df间隔table
1条回答
网友
1楼 · 发布于 2024-06-02 11:10:19

我不懂熊猫的自然区间运算,所以你需要做。 这里有一个方法,如果我正确地理解了约束条件。 这可能是一个O(n^3)问题,它将为大条目创建一个巨大的表。在

# make the new bounds
bounds=np.unique(np.hstack((df["from"],df["to"])))
df2=pd.DataFrame({"from":bounds[:-1],"to":bounds[1:]})

#find inclusions 
isin=df.apply(lambda x :
df2['from'].between(x[0],x[1]-1)
| df2['to'].between(x[0]+1,x[1])
,axis=1).T

#data
data=np.where(isin,df.intensity,0)

#result
df3=pd.DataFrame(data,
pd.MultiIndex.from_arrays(df2.values.T),df["min"])

用于:

^{pr2}$

相关问题 更多 >