Reputation: 3
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.
If I run same code, the start = 0
and end = 0
.
Where did I miss?
Upvotes: 0
Views: 574
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
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
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
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