我正在尝试解决以下问题: 我有一个数据帧。对于其中一个列,我有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])
答案 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