[英]How to forward propagate/fill a specific value in a Pandas DataFrame Column/Series?
[英]How to vectorize pandas dataframe forward column value search
我想只在正向搜索pandas dataframe列中的目標值,如果找到更大的值,那么我想將索引差異記錄為結果列。 我已經設法用兩個內部for循環來做這個,但它很慢。
這是我想在一個簡化的例子中實現的。
import pandas as pd
d = {
'Value' : [8,9,10,12,16,13,11,7,12,18],
'Target' : [12,12,11,15,19,11,16,11,17,18]
}
df = pd.DataFrame(data=d)
>>> df
Target Value
0 12 8
1 12 9
2 11 10
3 15 12
4 19 16
5 11 13
6 16 11
7 11 7
8 17 12
9 18 18
我們的第一個值是8,我們的目標值是12.我們在Value列中期待超過此目標值的值。 我們在第4行找到值16,我要記錄的是索引差異,即4-0 = 4。
下一個值是9,再次目標值是12.我們期待值並再次找到第4行的值16.Now索引差異是4-1 = 3
讓我們跳到第4行。 我們開始尋找從索引5開始向前的目標值。 如果沒有找到值,則結果為0。
這是我想要達到的結果列。
Target Value Result
0 12 8 4
1 12 9 3
2 11 10 1
3 15 12 1
4 19 16 0
5 11 13 3
6 16 11 3
7 11 7 1
8 17 12 1
9 18 18 0
這可以不用for循環嗎?
使用的比較,設置numpy的上三角矩陣numpy的廣播False
,獲得第一True
由指數numpy.argmax
,通過減去arange
,並設置為0
所有的底片:
t = df['Target'].values[:, None]
v = df['Value'].values
m = v > t
m[np.tril_indices(m.shape[1])] = False
print (m)
[[False False False False True True False False False True]
[False False False False True True False False False True]
[False False False True True True False False True True]
[False False False False True False False False False True]
[False False False False False False False False False False]
[False False False False False False False False True True]
[False False False False False False False False False True]
[False False False False False False False False True True]
[False False False False False False False False False True]
[False False False False False False False False False False]]
a = np.argmax(m, axis=1) - np.arange(len(df))
print (a)
[ 4 3 1 1 -4 3 3 1 1 -9]
df['new'] = np.where(a > 0, a, 0)
print (df)
Value Target new
0 8 12 4
1 9 12 3
2 10 11 1
3 12 15 1
4 16 19 0
5 13 11 3
6 11 16 3
7 7 11 1
8 12 17 1
9 18 18 0
您可以將其縮短為僅一個for循環。 使用Series.first_valid_index()和布爾條件:
df['Result'] = 0
for i, target in enumerate(df.Target):
val = df[(df.Value>target) & (df.index>i)]['Value'].first_valid_index()
if val is not None:
df.at[i, 'Result'] = val - i
df
Value Target Result
0 8 12 4
1 9 12 3
2 10 11 1
3 12 15 1
4 16 19 0
5 13 11 3
6 11 16 3
7 7 11 1
8 12 17 1
9 18 18 0
條件查找Value
大於目標的每一行,但也僅在目標索引和first_valid_index
將返回滿足條件的第一個索引之后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.