Python 如何用其他列的下n个条目的最小值填充DataFrame列
我有一个数据帧:Python 如何用其他列的下n个条目的最小值填充DataFrame列,python,performance,pandas,dataframe,Python,Performance,Pandas,Dataframe,我有一个数据帧: import numpy as np import pandas as pd np.random.seed(18) df = pd.DataFrame(np.random.randint(0,50,size=(10, 2)), columns=list('AB')) df['Min'] = np.nan n = 3 # can be changed 我需要用列“B”下n个元素的最小值填充列“Min”: 目前我使用迭代法: for row in range (0, df
import numpy as np
import pandas as pd
np.random.seed(18)
df = pd.DataFrame(np.random.randint(0,50,size=(10, 2)), columns=list('AB'))
df['Min'] = np.nan
n = 3 # can be changed
我需要用列“B”下n个元素的最小值填充列“Min”:
目前我使用迭代法:
for row in range (0, df.shape[0]-n):
low = []
for i in range (1, n+1):
low.append(df.loc[df.index[row+i], 'B'])
df.loc[df.index[row], 'Min'] = min(low)
但这是一个相当缓慢的过程。请问有没有更有效的方法?谢谢。与min
一起使用,然后:
如果性能很重要,请使用:
杰兹明白了。作为另一种选择,您还可以在系列中进行前滚(如Andy所建议的) @卡里凡-超级:)如果我的答案是有用的,不要忘记它-点击答案旁边的复选标记,将其从灰色变为填充。谢谢
df['Min'] = df['B'].rolling(n).min().shift(-n)
print (df)
A B Min
0 42 19 2.0
1 5 49 2.0
2 46 2 17.0
3 8 24 17.0
4 34 17 11.0
5 5 21 4.0
6 47 42 1.0
7 10 11 NaN
8 36 4 NaN
9 43 1 NaN
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
arr = rolling_window(df['B'].values, n).min(axis=1)
df['Min'] = np.concatenate([arr[1:], [np.nan] * n])
print (df)
A B Min
0 42 19 2.0
1 5 49 2.0
2 46 2 17.0
3 8 24 17.0
4 34 17 11.0
5 5 21 4.0
6 47 42 1.0
7 10 11 NaN
8 36 4 NaN
9 43 1 NaN
df.B[::-1].rolling(3).min()[::-1].shift(-1)
0 2.0
1 2.0
2 17.0
3 17.0
4 11.0
5 4.0
6 1.0
7 NaN
8 NaN
9 NaN