我有一个熊猫数据框,其中一些数据存储在称为“ col1”的列中。要计算最小值,我可以使用以下代码:
df = pd.DataFrame ([1,2,3,4,5,4,3,2,3,4,5,4,3,2,1,3,4,5,4,3,5,8,9], columns=["col1"] )
df['min'] = df.col1[(df.col1.shift(1) > df.col1) & (df.col1.shift(-1) > df.col1)]
您可以看到,我只是将一个单元格与其周围的2个单元格进行比较,如果下一个和上一个单元格较大,则意味着我有一个最小值,这就是我想要的。当我将其应用于“ col1”时,此方法工作正常,因为所有单元格都包含一个整数。
但是,如果我想重复将此代码应用于min列的过程,则会收到错误消息。如果执行代码,您将在“最小”列中看到只有三个单元格的值:2.0、1.0、3.0。
我要比较的是1.0和2.0以及3.0和3.0的值,它们是上一个和下一个值,以查看1.0是全局最小值还是相对最小值。问题是我不知道如何跳转穿过所有这些楠。
在此数字示例中,预期结果是一个新列,该列中到处充满Nan,但在一个单元格中包含绝对最小的1.0数并对应于14个索引位置。这只是一个非常简单的示例,实际上我有一列包含数千个数字,因此我希望在第二次迭代中仍能得到许多最小值。
基本上,即使它们之间有Nan单元,我仍然需要比较数据。
移位功能可以做到吗?我有什么选择?
谢谢
答案 0 :(得分:1)
您可以使用dropna()
来做到这一点:
df['min'] = df.col1.dropna()[(df.col1.dropna().shift(1) > df.col1.dropna()) & (df.col1.dropna().shift(-1) > df.col1.dropna())]
找到最小值的另一种可能方法是使用scipy.signal.argrelmin
:
from scipy.signal import argrelmin
df['min'] = df.col1.dropna().iloc[argrelmin(df.col1.dropna().values)[0]]