Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 随机应变_Python_Pandas - Fatal编程技术网

Python 随机应变

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'])):

我正在尝试解决以下问题: 我有一个数据帧。对于其中一列,我有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])
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
可能是一个文本值,而不是numpy
NaN
。请注意,如果您有三个连续的
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