首页 > 解决方案 > 在循环中比较相邻列中重复的行值以清理熊猫中的数据

问题描述

概括

0   101 2017/11 -9999.0 -7.60   -4.00   -9999.0 -9999.0 -4.00   -0.22   1.76    4.64    6.98    8.96    12.56   15.98   19.58   22.46   25.34   28.40   
1   101 2017/11 -9999.0 -7.78   -4.36   -9999.0 -9999.0 -4.36   -0.22   1.76    4.64    6.80    8.78    12.56   15.98   19.58   22.46   25.16   28.22
2   101 2017/11 -9999.0 -7.60   -4.18   -9999.0 -9999.0 -4.18   -0.22   1.76    4.46    6.80    8.78    12.56   15.98   19.58   22.46   25.16   28.22   
3   101 2017/11 -9999.0 -7.96   -5.26   -9999.0 -9999.0 -5.26   -0.40   1.76    4.46    6.80    8.60    12.38   15.98   19.58   22.46   25.16   28.22   
4   101 2017/11 -9999.0 -6.88   -4.36   -9999.0 -9999.0 -4.36   -0.40   1.58    4.46    6.80    8.60    12.38   15.98   19.58   22.46   25.16   28.22   
5   101 2017/11 20.30   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06
6   101 2017/11 19.76   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06
7   101 2017/11 20.30   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06   35.06

我需要能够从相邻列具有相同确切数字的列中删除数据。因此,在此示例中,第 5、6 和 7 列将如下所示:

5 2017/11   20.30   NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     
6 2017/11   19.76   NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     
7 2017/11   20.30   NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     

我试过的

我发现的很多答案似乎都在转换,然后表示一个布尔值。

我正在考虑像这样的伪代码来检查相邻的列

for i, row in data.iterrows():
    rowvar = i
    if data.iloc[i] == rowvar:
        data.iloc[i] = np.nan

但这显然行不通。

实际的

ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types

有没有一种简单的方法可以做到这一点,可能更像 Pythonic/Pandas?

标签: pythonpandascsv

解决方案


pandas.diff()确实是适合您的功能。但是,如果值相等,您需要检查两个方向的列。NaN如果上一列下一列具有相同的值,则此代码将所有值设置为:

import numpy as np
data[np.logical_or(data.diff(axis=1) == 0, data.diff(axis=1, periods=-1) == 0)] = np.nan

推荐阅读