如何用其他列的下n个条目的最小值填充DataFrame列

2024-04-25 23:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

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

enter image description here

我需要用“B”列下n个元素的最小值填充“Min”列: enter image description here

目前我使用迭代:

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)

但这是一个相当缓慢的过程。请问有没有更有效的办法?非常感谢。你知道吗


Tags: 数据inimportdfforindexasnp
3条回答

杰兹明白了。作为另一种选择,您还可以对该系列进行前滚(正如Andy here所建议的那样)

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

^{}min一起使用,然后^{}

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

如果性能很重要,请使用this solution

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

相关问题 更多 >