【问题标题】:How can I remove the 'NaN' not removing the data?如何删除不删除数据的“NaN”?
【发布时间】:2019-01-21 16:13:34
【问题描述】:

我正在尝试删除“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 的数据。

如果看数据的话,1到10有第0行的数据,11到21有第1行的数据。

即有两行数据。

我想把它换成一行,不带 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

我错过了什么?

【问题讨论】:

  • 欢迎来到 SO,我想问一下您是如何从 CSVtext 或其他类型导入数据集的?如果您使用的是 csv 或 excel,那么在处理时您可以删除 nan 值,这使得进一步处理变得容易。

标签: python pandas numpy dataframe nan


【解决方案1】:

如果你已经使用 Pandas 将数据加载到数据框中,你可以使用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

【讨论】:

  • 我做到了...但这不是我想要的。
  • 好的,你能更具体一点,比如你想如何合并吗?另外,请发布您提出的代码。这可能更容易理解问题。
  • 我添加了代码和它的一些结果。请看看哪里错了。
【解决方案2】:

这是你想要的吗?

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 数组将测试压缩到不全是 nan 的行

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.]])

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      首先,您将数据框的列分成两部分。你的情况是 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 2017-11-12
        • 2019-11-19
        • 1970-01-01
        • 2016-06-16
        • 2017-09-04
        相关资源
        最近更新 更多