Python - замена массива через многостолбцовый индекс и функцию .replace () - PullRequest
0 голосов
/ 20 октября 2018

Замените отфильтрованный массив (a) на другой столбец, аналогичный отфильтрованному массиву (b).

In[1]import pandas as pd
     import matplotlib.pyplot as plt
     %matplotlib inline
     import seaborn as sns
     sns.set(font_scale=1.5)
     import numpy as np
     import datetime
     from pylab import rcParams
     rcParams['figure.figsize'] = 20, 10``` 

-

#definition of a
In[2] a = df.fldLastUpdatedDate[df.index[df.fldScheduleCreatedDt.notnull() & 
          df.fldLastUpdatedDate.isnull()]]
In[3] a
Out[3]917   NaT
      932   NaT
      933   NaT
      934   NaT
      938   NaT
             ..
     69932  NaT
      Name: fldLastUpdatedDate, Length: 20802, dtype: datetime64[ns]

-

#definition of b
In[4] b = df.combined[df.index[df.fldScheduleCreatedDt.notnull() & 
          df.fldLastUpdatedDate.isnull()]]
In[5] b
Out[5]917   2011-08-12 09:00:00
      932   2011-08-09 09:00:00
      933   2011-08-09 10:15:00
      934   2011-08-04 13:00:00
      938   2011-08-02 12:30:00
                    ..
     69932  2018-11-02 15:00:00
      Name: combined, Length: 20802, dtype: datetime64[ns]

-

#replace a with b
In[5] df.fldLastUpdatedDate = df.fldLastUpdatedDate.replace(a,b)

-

#check a
In[6] a
Out[6]917   NaT
      932   NaT
      933   NaT
      934   NaT
      938   NaT
             ..
      69932 NaT
      Name: fldLastUpdatedDate, Length: 20802, dtype: datetime64[ns]

Без изменений (и без ошибок).Радость.

Вопросы о звучащих решениях, которые я рассмотрел:

(1) Есть ли инструмент отладки, который я мог бы использовать, чтобы показать мне, что здесь происходит?

(2) Я использую .replace() в параметрах SOP?

(3) Существуют ли другие решения, не основанные на петлях, которые соответствовали бы критериям решения этой проблемы?

1 Ответ

0 голосов
/ 21 октября 2018

Если я правильно понимаю этот вопрос, у вас есть один DataFrame, к которому вы применяете два фильтра (a и b).Вы хотите заменить значения для a в df.fldLastUpdatedDate, которые соответствуют индексам в b.

Это довольно просто, если вы используете loc.

Давайте начнем с создания фиктивных данных:

x = list(range(0,10))
for i in range(0,10):
    x.append(None)
np.random.shuffle(x)
y = list(range(0,20))
df = pd.DataFrame(data={'x': x, 'y': y})

Следующим шагом мы создадим нашу логическую маску:

x_is_null = df['x'].isnull()

Затем мы применяем нашу маску и обновляем 'x' значениями из другой серии с соответствующим индексом:

df.loc[x_is_null, 'x'] = df['y']

В вашем случае я бы переписал код следующим образом:

Шаг 1 : создайте нашу логическую маску для a:

a = df.fldScheduleCreatedDt.notnull() & df.fldLastUpdatedDate.isnull()

Шаг 2: Примените нашу логическую маску и замените ее даннымииз столбца с именем combined, используя loc:

df.loc[a, 'fldLastUpdatedDate'] = df['combined']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...