我有两个数据帧。rdf是我试图使用的参考数据框,用于定义间隔(顶部和底部)以计算平均值(此间隔之间的所有深度),但使用ldf实际运行该计算,因为它包含值。rdf定义了每个id号的顶部和底部,每个id号都应该运行平均值。每个id有多个间隔
rdf的格式如下:
ID Top Bottom
1 2010 3000
1 4300 4500
1 4550 5000
1 7100 7700
2 3200 4100
2 4120 4180
2 4300 5300
2 5500 5520
3 2300 2380
3 3200 4500
ldf的来源如下:
ID Depth(ft) Value1 Value2 Value3
1 2000 45 .32 423
1 2000.5 43 .33 500
1 2001 40 .12 643
1 2001.5 28 .10 20
1 2002 40 .10 34
1 2002.5 23 .11 60
1 2003 34 .08 900
1 2003.5 54 .04 1002
2 2000 40 .28 560
2 2000 38 .25 654
...
3 2000 43 .30 343
我想使用rdf定义区间的顶部和底部,以计算Value1、Value2和Value3的平均值。我还希望记录一个计数(并非所有间隔之间的值都必然存在,因此它可能小于底部-顶部的差异)。然后将修改rdf以生成新文件:
新rdf的格式如下:
ID Top Bottom avgValue1 avgValue2 avgValue3 ThicknessCount(ft)
1 2010 3000 54 .14 456 74
1 4300 4500 23 .18 632 124
1 4550 5000 34 .24 780 111
1 7100 7700 54 .19 932 322
2 3200 4100 52 .32 134 532
2 4120 4180 16 .11 111 32
2 4300 5300 63 .29 872 873
2 5500 5520 33 .27 1111 9
3 2300 2380 63 .13 1442 32
3 3200 4500 37 .14 1839 87
我一直在寻找最好的方法。我试着模仿这个时间序列示例:Sum set of values from pandas dataframe within certain time frame
但它似乎不可翻译:
import pandas as pd
Top = rdf['Top']
Bottom = rdf['Bottom']
Depths = ldf['DEPTH']
def get_depths(x):
n = ldf[(ldf['DEPTH']>x['top']) & (ldf['DEPTH']<x['bottom'])]
return n['ID'].values[0],n['DEPTH'].sum()
test = pd.DataFrame({'top':Top, 'bottom':Bottom})
test[['ID','Value1']] = test.apply(lambda x : get_depths(x),1).apply(pd.Series)
我得到"TypeError: Invalid comparison between dtype=float64 and str"
如果我使用他们在帖子中制作的样本,它是有效的,但它不适用于我的数据。我也希望有一个更简单的方法来做到这一点
样本数据和导入
使用
dfr
的每一行从df
中筛选和提取统计信息"TypeError: Invalid comparison between dtype=float64 and str"
,有很多答案。需要清除数值列中无法转换为数值类型的任何值李>dfr
中的每一行:df
.T
将mean
和count
行转置为列v_mean
count
NaNs
,它们可能都是相同的v_mean
转换为数据帧,并将其连接到dfr_new
dfr_new
中添加counts
列编辑#2A:
注: 下面的示例数据帧与问题中发布的数据帧不完全相同
在这里发布一个新代码,使用
Top
和rdf
中的Bottom
来检查DEPTH
中的ldf
来使用for-loop
计算每个组的.mean()
。假定数据帧rdf
没有任何重复项,则在rdf
中创建一个对每行唯一的range_key
输出:
编辑#1:
下面的代码似乎有效。从上面发布的代码中向
return
添加了一个if-statement
。不确定这是否是你想要的。它计算.sum()
。将rdf
中的第一个值更改为较低的范围,以匹配ldf
中的数据输出:
相关问题 更多 >
编程相关推荐