如何删除不删除数据的“ NaN”?

时间:2019-01-20 04:54:08

标签: python pandas numpy dataframe nan

我正在尝试删除“ NaN”。

详细地说,一行上有数据,并且显示“ NaN”。

我的数据如下所示。

     01   02   03   04   05   06     07     08   09    10 ...      12   13  \
0   0.0  0.0  0.0  0.0  0.0  0.0  132.0  321.0  0.0  31.0 ...     NaN  NaN   
1   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...   0.936  0.0   
2   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
3   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
4   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
5   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
6   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
7   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
8   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
9   NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
10  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
11  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
12  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
13  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
14  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
15  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
16  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
17  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
18  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
19  0.0  0.0  0.0  0.0  0.0  0.0  132.0  321.0  0.0  31.0 ...     NaN  NaN   
20  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...   0.936  0.0   
21  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
22  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
23  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
24  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
25  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
26  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
27  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
28  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   
29  NaN  NaN  NaN  NaN  NaN  NaN    NaN    NaN  NaN   NaN ...     NaN  NaN   

          14         15      16   17   18        19   20   21  
0        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
1   8.984375  15.234375  646.25  0.0  0.0  9.765625  0.0  0.0  
2        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
3        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
4        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
5        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
6        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
7        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
8        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
9        NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
10       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
11       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
12       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
13       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
14       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
15       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
16       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
17       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
18       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
19       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
20  8.984375  15.234375  646.25  0.0  0.0  9.765625  0.0  0.0  
21       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
22       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
23       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
24       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
25       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
26       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
27       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
28       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  
29       NaN        NaN     NaN  NaN  NaN       NaN  NaN  NaN  

[30 rows x 21 columns]

我想消除数据之间的NAN,每18行制作一个数据。

     01   02   03   04   05   06     07     08   09    10 ...      12   13  \
0   0.0  0.0  0.0  0.0  0.0  0.0  132.0  321.0  0.0  31.0 ...     0.936  0.0
1   0.0  0.0  0.0  0.0  0.0  0.0  132.0  321.0  0.0  31.0 ...     0.936  0.0 

          14         15      16   17   18        19   20   21   
0   8.984375  15.234375  646.25  0.0  0.0  9.765625  0.0  0.0  
1   8.984375  15.234375  646.25  0.0  0.0  9.765625  0.0  0.0  

我尝试了'dropna()'选项(使用'how ='all'或'thread ='10')。

但是这些不是我想要的。

如何删除NaN并合并数据?


添加

这是我使用的代码(python2)。

df_concat = []
for j in range(len(data_file)):
    print("%s data_file_concat  %s %s of %s finished" % (Driver, data_file[j], j, len(data_file)))
    x = pd.read_csv(data_file[j])
    if len(df_concat) != 0:
        df_concat = [df_concat, x]
        df_concat = pd.concat(df_concat, sort=False)
    else:
        df_concat = x
    print("%s df_concat %s of %s finished" %(Driver,j,len(df_concat)))


df_concat是具有NaN的数据。

如果查看数据,则第0行中的数据是1到10,第1行中的数据是11到21。

也就是说,有两行数据。

我想将其包装在没有NaN的一行中。

     01   02   03   04   05   06     07     08   09    10 ...      12   13  \
0   0.0  0.0  0.0  0.0  0.0  0.0  132.0  321.0  0.0  31.0 ...     0.936  0.0
1   0.0  0.0  0.0  0.0  0.0  0.0  132.0  321.0  0.0  31.0 ...     0.936  0.0 

          14         15      16   17   18        19   20   21   
0   8.984375  15.234375  646.25  0.0  0.0  9.765625  0.0  0.0  
1   8.984375  15.234375  646.25  0.0  0.0  9.765625  0.0  0.0  

喜欢这个结果。

我尝试重新索引该行以使用重新采样。

df_concat.index = pd.to_datetime(df_concat.index, unit='s')
df_concat_colums=df_concat.columns
start = None
end = None

for i in range(len(df_concat[df_concat_colums[0]])):
    if ~pd.isnull(df_concat[df_concat_colums[0]][i]):
        if start == None:
            start = i
        elif end == None:
            end = i-1
            break

然后保存开始索引和结束索引。

index_time = df_concat['01'].index[end] - df_concat['01'].index[start]

然后保存index_time以使用重采样时间。

df_time_merge = df_concat.resample(index_time).mean()

“ df_time_merge”的结果是这样的。 enter image description here

正在工作!

但是,如果我有这样的数据(以Nan开头),则代码无法正常工作。

enter image description here

如果我运行相同的代码,则start = 0end = 0

我想念哪里?

4 个答案:

答案 0 :(得分:1)

如果您已使用熊猫将数据加载到数据框中,则可以使用df.dropna(), 其中df = pd.DataFrame(<your_data_here>)

还可以传递如下参数:

df.dropna(how='any')    #to drop if any value in the row has a nan
df.dropna(how='all')    #to drop if all values in the row are nan

答案 1 :(得分:0)

看看这个。 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

df.dropna(args ..)。是你所追求的。

答案 2 :(得分:0)

您的完整解决方案如下: 确保您的数据框结构是规则的。

首先,将数据框的列分为两部分。在您的情况下1-11、12-21。

your_df=pd.read_csv(...)
columns1=list(range(12))
columns2=list(range(12,22))

df1=your_df[columns1].dropna()
df2=your_df[columns2].dropna().reset_index(drop=True)

df_new=pd.concat([df2,df3], axis=1)

答案 3 :(得分:0)

这是您想要的吗?

def make_sample():
    test=np.full((8,12), np.nan)
    test[0,:6]=np.arange(6)
    test[1,6:]=np.arange(6,18,2)
    test[4:6,:]=2*test[:2,:]
    return test

test=make_sample()

In [74]: test
Out[74]: 
array([[ 0.,  1.,  2.,  3.,  4.,  5., nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan,  6.,  8., 10., 12., 14., 16.],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [ 0.,  2.,  4.,  6.,  8., 10., nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, 12., 16., 20., 24., 28., 32.],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]])

创建一个数组以识别哪些行不是全部nans

filt=1^np.isnan(test).all(axis=1)

In [78]: filt
Out[78]: array([1, 1, 0, 0, 1, 1, 0, 0])

使用tat数组将测试压缩到并非全部为nans的行

compress=np.compress(filt, test, axis=0)

In [80]: compress
Out[80]: 
array([[ 0.,  1.,  2.,  3.,  4.,  5., nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan,  6.,  8., 10., 12., 14., 16.],
       [ 0.,  2.,  4.,  6.,  8., 10., nan, nan, nan, nan, nan, nan],
       [nan, nan, nan, nan, nan, nan, 12., 16., 20., 24., 28., 32.]])

将nans设置为零

compress[np.isnan(compress)]=0

In [83]: compress
Out[83]: 
array([[ 0.,  1.,  2.,  3.,  4.,  5.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  6.,  8., 10., 12., 14., 16.],
       [ 0.,  2.,  4.,  6.,  8., 10.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0., 12., 16., 20., 24., 28., 32.]])

将奇数行添加到偶数行

In [84]: compress[::2,:]+compress[1::2,:]
Out[84]:  
array([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  8., 10., 12., 14., 16.],
       [ 0.,  2.,  4.,  6.,  8., 10., 12., 16., 20., 24., 28., 32.]])