Как я могу удалить «NaN», не удаляя данные? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь удалить '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' такой: введите описание изображения здесь

Работает !!

Но если у меня есть такие данные (начиная с Nan), код не работает.

введите описание изображения здесь

Если я запускаю один и тот же код, start = 0 и end = 0.

Где я скучал?

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Делает ли это то, что вам нужно?

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

Установить наны на ноль

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.]])
0 голосов
/ 20 января 2019

Если вы загрузили данные в фрейм данных с помощью 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
0 голосов
/ 21 января 2019

Ниже приведено полное решение: убедитесь, что структура вашего фрейма данных правильная.

Сначала вы разбили столбцы фрейма данных на две части.В вашем случае 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)
0 голосов
/ 20 января 2019

Посмотрите на это.https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

df.dropna (args ..).Это то, что вы после.

...