K. Minseok
K. Minseok

Reputation: 3

How can I remove the 'NaN' not removing the data?

I'm trying to remove the 'NaN'.

In detail, there is data on one line and 'NaN'.

My data looks like the one below.

     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]

I want to eliminate the NAN between the data and make one data for every 18 lines.

     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  

I tried option 'dropna()' (using 'how = 'all'' or 'thread = '10'').

But these are not what I want.

How can I remove NaN and merge data?


Add

This is the code that I using(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)))


The df_concat is the data that have NaN.

If you look at the data, there are data in the 0th line from 1 to 10, and data in the 1st line from 11th to 21st.

That is, there are two lines of data.

I want to wrap this in a single line without 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  

Like this result.

I tried to re-index the row to time to using resampling.

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

And I save the start and end index.

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

And I save the index_time to use resampling time.

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

The result of 'df_time_merge' is like this. enter image description here

It's working!!

But if I have data(starting with Nan) like this, the code didn't working.

enter image description here

If I run same code, the start = 0 and end = 0.

Where did I miss?

Upvotes: 0

Views: 574

Answers (4)

Tls Chris
Tls Chris

Reputation: 3824

Does this do what you want?

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

Create an array to identify which rows are NOT all nans

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

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

Use tat array to compress test to rows that are not all 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.]])

Set nans to zero

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

Add odd to even rows

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

Upvotes: 0

Fatih1923
Fatih1923

Reputation: 2691

Your complete solution is below: Be sure, your dataframe structure is regular.

First you split columns of the dataframe into two part. In your case 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)

Upvotes: 0

Jim Todd
Jim Todd

Reputation: 1588

If you have loaded the data into dataframe using Pandas, you can use df.dropna(), where , df = pd.DataFrame(<your_data_here>)

Also you can pass parameters like below:

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

Upvotes: 1

AussieOz
AussieOz

Reputation: 71

Have a look at this. https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

df.dropna(args..). Is what you are after.

Upvotes: 0

Related Questions