Как получить первую и последнюю пары чисел из массива / кадра данных, пропустив NaN - PullRequest
3 голосов
/ 02 октября 2019

Учитывая список или фрейм данных (вопрос скорости):

data = 

array([[45,  7, 43,6,nan, nan],
       [44,  6, 42,5,nan,nan],
       [nan, nan, nan, nan,nan,nan],
       [41,  5, 48,23,21,34],
       [46,  4, 47,22,nan,nan],
       [nan, nan, nan,nan,nan,nan]])

для каждой строки, которую я хочу получить первым и последним 2 числами , пропуская NaN's и сохраняяих.

Желаемый вывод:

final_data = ([45,7, 35,6],
              [first 2 number, last 2 numbers]
              [first 2 number, last 2 numbers]
              [first 2 number, last 2 numbers]
              [first 2 number, last 2 numbers])

1 Ответ

1 голос
/ 02 октября 2019

Если вы используете numpy, вы можете использовать логический оператор not и np.isnan () .

Вот краткий пример:

>>> x = np.array([[1,2,3,4,5],[1,2,3,np.nan,np.nan]])
>>> for a in x:
...     r = a[~np.isnan(a)]
...     print(r[:2],r[-2:])
...
[1. 2.] [4. 5.]
[1. 2.] [2. 3.]

Используя ваши данные:

>>> x
array([[45.,  7., 43.,  6., nan, nan],
       [44.,  6., 42.,  5., nan, nan],
       [nan, nan, nan, nan, nan, nan],
       [41.,  5., 48., 23., 21., 34.],
       [46.,  4., 47., 22., nan, nan],
       [nan, nan, nan, nan, nan, nan]])

Тогда

final_data = [] 

for a in x:   
    r = a[~np.isnan(a)] 
    if len(r): #skip empty arrays
        res = (r[:2],r[-2:])
    final_data.append(res)

pd.DataFrame(final_data)

    [45.  7.] [43.  6.]
    [44.  6.] [42.  5.]
    [41.  5.] [21. 34.]
    [46.  4.] [47. 22.]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...