Python 随机应变
我正在尝试解决以下问题: 我有一个数据帧。对于其中一列,我有NAN和数字,以随机方式分布。我想删除基于此列的行。我的标准是:如果这一行上面和下面的那一行的值都是NAN,那么我就删除这一行。否则,我会将该行保留在数据框中 这是我努力做到的,但我确信这是错误的。。。非常感谢您的帮助Python 随机应变,python,pandas,Python,Pandas,我正在尝试解决以下问题: 我有一个数据帧。对于其中一列,我有NAN和数字,以随机方式分布。我想删除基于此列的行。我的标准是:如果这一行上面和下面的那一行的值都是NAN,那么我就删除这一行。否则,我会将该行保留在数据框中 这是我努力做到的,但我确信这是错误的。。。非常感谢您的帮助 i=0 while i <= 500: if (np.isnan(df.iloc[i+1]['column1'])) & (np.isnan(df.iloc[i-1]['column1'])):
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])
i=0
当我创建样本数据时:
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
示例数据:
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
您是要删除所有NaN和该值,还是只删除一行并保留NaN?你以后会删除所有的南吗?我不想删除所有的南。我已经合并了两个数据集,我只对属于数据集2的值和数据集1中的值感兴趣,这些值位于数据集2中的值之前和之后。PS:数据集有不同的列,所以这就是所有NAN的原因。我尝试使用您的方法,但我得到以下错误:{TypeError:ufunc'isnan'不支持输入类型,并且无法根据强制转换规则“安全”将输入安全强制为任何支持的类型。}我认为这是因为我所有的数据帧类型都是对象。我不知道如何解决这个问题…@LauraSimonsenLeal你可以试试df['col1']=df['col1'].astype(np.float32)
。这会将它从一个对象更改为float32。如果不查看数据,则不确定。我猜NaN
可能是一个文本值,而不是numpyNaN
。请注意,如果您有三个连续的NaN
行,它将根据您的要求删除中间的一行。嗨,Alex,我发现了问题。我需要逻辑条件中的一个额外条件。最后,这是最终的解决方案:df1=df[~(df['col1'].shift(1.isnull())&(df['col1'].shift(-1.isnull())&(df['col1'].isnull())]因此您的条件是删除上面的行是NaN,下面的行是NaN,而行本身不是NaN。是的,对不起!谢谢你的帮助!!
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