gpt4 book ai didi

python - 具有多个条件的模糊连接

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:12 25 4
gpt4 key购买 nike

我知道有类似标题的问题,但没有一个能真正回答我的问题。我有一个数据框如下。 “索引”列实际上是时间戳。 A 列是有多少吨 Material 被倾倒到 splinter 机中。 B列是每个时间戳的 splinter 率。我想知道的是,根据 splinter 率(B 列),何时 splinter Material (A 列)。

存在三种可能的情况。

  1. 在加载第二批时压碎第一批。
  2. 第一次装载在第二次装载之前被压碎
  3. 添加第二个负载时第一个负载没有被压碎

我尝试计算A列和B列的累加值,并使用merge_asof进行模糊连接。但它并没有像预期的那样工作,因为没有存储过多的 splinter 能力。只考虑装料后的 splinter 率。

A = {'index':range(1,11),'A':[300,0,0,400,0,0,0,0,150,0]}
B = {'index':range(1,11),'B':[102,103,94,120,145,114,126,117,107,100]}
A = pd.DataFrame(data=A)
B = pd.DataFrame(data=B)

这是预期的结果:

IndexA  A   IndexB  B_accumulate 
1 300 4 419
4 400 8 502
9 150 10 207

B_accumulate 是总 splinter 率(B),当 Material 被压碎时(当 B_accumlate>=A 时)重置为 0

最佳答案

我简化了结构,使用 Series 而不是 DataFrame,索引从零开始。 应用了 cumsum() 和 searchsorted()。

Load = pd.Series([300,0,0,400,50,0,0,0,150,0])  # aka 'A'
Rate = pd.Series([102,103,94,120,145,114,126,117,107,100]) # aka 'B'

# Storage for the result:
H=[] # [ (indexLoad, Load, indexRate, excess) ... ]

# Find the 1st non 0 load:
load1_idx= len(Load)

for lix in range(len(Load)):
a= Load[lix]
if a!=0:
csumser= Rate.cumsum()
rix= csumser.searchsorted(a)
excess= csumser[rix]-a
H.append( (lix,a,rix,excess) )
load1_idx=lix
break

# Processing
for lix in range(load1_idx+1,len(Load)):

a=Load[lix]
if a==0:
continue

last_rix= H[-1][-2]
csumser[last_rix:]= Rate[last_rix:]
if lix==last_rix:
csumser[lix]= H[-1][-1] # excess

csumser[last_rix:]= csumser[last_rix:].cumsum()

rix= csumser[last_rix:].searchsorted(a)
rix+= last_rix
excess= csumser[rix]-a
H.append( (lix,a,rix,excess) )

df= pd.DataFrame(H, columns=["indexLoad","Load","indexRate","rate_excess"])
print(df)

indexLoad Load indexRate rate_excess
0 0 300 3 119
1 3 400 6 104
2 4 50 6 76
3 8 150 7 93

关于python - 具有多个条件的模糊连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58090582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com