2017-07-03 45 views
2

我有长间隔的数据的数据帧(从钻孔)的数据看起来是这样的:木材长度(米)的间隔与熊猫

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'。输出应该是这样的:

df.somefunc(index=['from','to'], columns='min', values='intensity', fill_value=0) 
Out[47]: 
    from to py cpy spy 
0  0 5 2 0 0 
1  5 10 2 3.5 0 
2 10 14 0 3.5 0 
3 14 15 0 3.5 0.7 
4 15 27 0 0 0.7 

所以基本上“从”和“至”描述不重叠的区间向下钻孔,其中间隔被拆的最小公分母 - 正如你所看到的已经将原始表中的“py”间隔分割为第一个(0-5m)和py:2,cpy:0,第二个(5-10m)分割为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 

刚刚对待从和到组合作为索引列。重要的一点是我的输出不能与值相重叠(IE后面的'from'值不能小于之前的'to'值)。

有没有一个使用熊猫来完成这个优雅的方法?谢谢您的帮助!

回答

1

我不知道熊猫自然区间算法,所以你需要做的。 这里有一个方法来做到这一点,如果我正确理解约束条件。 这可能是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"]) 

为:

In [26]: df3 
Out[26]: 
min  py cpy spy 
0 5 2.0 0.0 0.0 
5 10 2.0 3.5 0.0 
10 14 0.0 3.5 0.0 
14 15 0.0 3.5 0.7 
15 27 0.0 0.0 0.7 
+0

哇,这是实际上的代码少了很多线,然后我想这将需要。非常感谢!!! –