【问题标题】:How to loop through pandas dataframe ignoring Nan cells?如何循环忽略Nan单元格的熊猫数据框?
【发布时间】:2020-09-05 05:24:52
【问题描述】:

我有一个 pandas 数据框,其中一些数据存储在名为“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 列的过程,我会收到错误消息。如果执行代码,您将在“min”列中看到只有三个具有值的单元格:2.0、1.0、3.0。

我想要的是将 1.0 与 2.0 和 3.0 进行比较,它们是上一个和下一个值,以查看 1.0 是全局最小值还是只是相对最小值。问题是我不知道如何跳转通过所有这些楠。

在这个数字示例中,预期的结果是一个新的列,除了一个包含绝对最小值的 1.0 数字的单元格之外,到处都用 Nan 填充,并且对应于 14 索引位置。这只是一个非常简单的示例,实际上我有一列包含数千个数字,因此我希望在第二次迭代中仍能获得许多最小值。

即使它们之间有Nan单元格,我仍然需要比较数据。

shift函数能做到吗?我有什么选择?

谢谢

【问题讨论】:

  • 你可以添加一些数据样本,minimal, complete, and verifiable example 吗?
  • 感谢 jezrael 的建议,我添加了一个数字示例和更多解释,希望现在更清楚
  • 好多了。最后一件事,是否可以查看验证解决方案的预期输出?

标签: python pandas loops dataframe


【解决方案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]]

【讨论】:

  • 我得到这个错误:AttributeError: 'function' object has no attribute 'dropna'
  • 我用 Python 3.7 和 Pandas 1.0.3 运行了这段代码 - 没有发生这样的错误。
  • 但是你有没有将它应用到带有 Nan 单元格的 min 列?我的意思是,它应该是: df["min2"] = df.min.dropna() [ (df.min.dropna().shift(1) > df.min.dropna()) & (df.min. dropna().shift(-1) > df.min.dropna())]
  • 'min' 列中的 NaN 出现在没有预期最小值的地方。如果您只想要最小值的值,则必须将结果保存在另一个帧或系列中,或者从原始数据帧中删除所有“min”为 NaN 的行。
  • 很奇怪,如果我使用此代码 df.dropna() 将 dropna () 应用于整个数据帧,我会得到一个没有 Nan 值的新数据帧,所以这里没有错误。但是,如果我像您一样将其应用于列,则会收到错误 df.min.dropna() 在我的情况下生成错误。 mac13k,我不想创建新的数据框,也无法删除行,因为它们包含原始数据和第一个最小值。所以它必须在这个数据框中完成,我只是希望得到越来越多的 Nan 单元格的列。
猜你喜欢
  • 2019-08-30
  • 2016-04-20
  • 2017-10-29
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多