Заполнение пустых ячеек «столбец B» последним известным значением, если строки имеют одинаковое значение «столбец A» - PullRequest
3 голосов
/ 16 октября 2019

Я действительно новичок в Python и Datascience.

У меня большой набор данных (с 100K + строками), в этом наборе данных у меня есть два столбца A и B. A является столбцом Datetime, а B является строкой.

В столбце B есть некоторые значения NaN, я хочу заполнить эти значения NaN последним известным значением столбца B, учитывая условие, что моя пустая строка столбца B и ужезаполненные строки столбца B находятся в том же дне, месяце и году (столбец A).

Позвольте мне объяснить мою личность:

Допустим, это мой ввод:

df=pd.DataFrame({'A': ["2019-03-13 08:12:23", "2019-03-13 07:10:18", "2019-03-20 08:12:23", "2019-03-13 08:12:23", "2019-03-15 10:35:53", "2019-03-20 11:12:23"], 'B': ["B1", "B0", "B13", np.nan, "B10", "B12"]})
                     A    B
0  2019-03-13 08:12:23   B1
1  2019-03-13 07:10:18   B0
2  2019-03-20 08:12:23  B13
3  2019-03-13 08:12:23  NaN
4  2019-03-15 10:35:53  B10
5  2019-03-20 11:12:23  B12

Я хочу заполнить значение NaN значением B1 (значение B, которое происходит в тот же день и имеет наибольшее время, при условии, что это «самое большое время» не опережает фактическое значение столбца A).

Таким образом, мой вывод должен выглядеть следующим образом:

                     A    B
0  2019-03-13 08:12:23   B1
1  2019-03-13 07:10:18   B0
2  2019-03-20 08:12:23  B13
3  2019-03-13 08:12:23   B1
4  2019-03-15 10:35:53  B10
5  2019-03-20 11:12:23  B12

Я пытался добиться этого безуспешно, лучшее, что я мог сделать, это сделать значение NaN равным B13, используя это:

df['B']=df['B'].replace({'B': {0: np.nan}}).ffill()

Ребята, скажите, пожалуйста, какой самый лучший и экономичный способ для этого?

Ответы [ 3 ]

3 голосов
/ 16 октября 2019

Использование groupby + ffill

as_date = pd.to_datetime(df.A)
s = np.argsort(as_date)

df['B'] = df.B.loc[s].groupby(as_date.loc[s].dt.date).ffill().loc[df.index]

                     A    B
0  2019-03-13 08:12:23   B1
1  2019-03-13 07:10:18   B0
2  2019-03-20 08:12:23  B13
3  2019-03-13 08:12:23   B1
4  2019-03-15 10:35:53  B10
5  2019-03-20 11:12:23  B12
1 голос
/ 16 октября 2019

Ваша задача может быть выполнена с помощью следующих однострочных :

df.B = df.sort_values('A').groupby(pd.to_datetime(df.A).dt.date).B.ffill()
1 голос
/ 16 октября 2019

Попробуйте groupby().idxmax():

max_val = df.loc[df['A'].groupby(df['A'].dt.date).transform('idxmax'),'B'].values

df['B'] = np.where(df['B'].isna(), max_val, df['B'])

Вывод:

                    A    B
0 2019-03-13 08:12:23   B1
1 2019-03-13 07:10:18   B0
2 2019-03-20 08:12:23  B13
3 2019-03-13 08:12:23   B1
4 2019-03-15 10:35:53  B10
5 2019-03-20 11:12:23  B12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...