条件下降

时间:2017-08-14 15:27:00

标签: python pandas

我正在尝试解决以下问题: 我有一个数据帧。对于其中一个列,我有NAN和数字,以随机方式分发。我想根据此列删除行。我的标准是:如果高于这一行的行和下面的行具有NAN作为值,那么我放弃该行。另外,我在数据框中保留了这一行。

这是我设法达到的目的,但我确信这是错误的...非常感谢任何帮助!

i=0
while i <= 500:
    if (np.isnan(df.iloc[i+1]['column1'])) &  (np.isnan(df.iloc[i-1]['column1'])):
        df2[i] = df.drop(df[i])

2 个答案:

答案 0 :(得分:2)

创建样本数据:

AsyncPost ap = new AsyncPost(this);

应用过滤器。

np.random.seed(0)
df= pd.DataFrame({'column1': np.random.randn(10)})
df.iloc[[2, 4, 7], 0] = np.nan
>>> df
    column1
0  1.764052
1  0.400157
2       NaN
3  2.240893   # <<< Drop.
4       NaN
5 -0.977278
6  0.950088
7       NaN
8 -0.103219
9  0.410599

答案 1 :(得分:1)

示例数据

my_df = pd.DataFrame({
    "col1":[5.43,np.nan, np.nan, 0.5, 0.4, 0.5, np.nan, 0.1, np.nan, 0.33]
})

您可以创建移位列并避免循环数据集。

my_df['forward_shift'] = my_df.col1.shift(periods=1)
my_df['backward_shift'] = my_df.col1.shift(periods=-1)

out = my_df[-(np.isnan(my_df.forward_shift) & np.isnan(my_df.backward_shift))]
out['col1'].reset_index(drop=True)

0    NaN
1    NaN
2    0.5
3    0.4
4    0.5
5    NaN
6    NaN
Name: col1, dtype: float64