如何遍历熊猫数据框而忽略Nan细胞?

时间:2020-05-19 08:05:01

标签: python pandas loops dataframe

我有一个熊猫数据框,其中一些数据存储在称为“ 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单元,我仍然需要比较数据。

移位功能可以做到吗?我有什么选择?

谢谢

1 个答案:

答案 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]]