Как назначить значение из другого значения в том же столбце на основе ближайшей даты? - PullRequest
1 голос
/ 10 октября 2019

Я хочу заменить некоторые значения, которые в настоящее время равны 0 (столбец C), на значения (столбец C), которые находятся ближе всего к дате (столбец Date), на основе аналогичной группировки переменных (тип столбца)

Я исследовал .index.get_loc (df, method = "near"), но мне не повезло применить его в моем коде.

d = pd.DataFrame(np.array([['2018-12-29',5,6,5,'cc'],
                           ['2019-01-05',1,2,0,'cc'],
                           ['2018-12-29',3,4,10,'cc'],
                           ['2019-01-01',1,2,0,'bb'],
                           ['2018-12-29',3,4,20,'bb'],
                           ['2019-01-10',7,9,5,'bb']]),
                columns =['Date','A','B','C','Type'])


#      Date     A   B   C      Type
#0  2018-12-29  5   6   5.0     cc
#1  2019-01-05  1   2   0       cc
#2  2018-12-29  3   4   10.0    cc
#3  2019-01-01  1   2   0       bb
#4  2018-12-29  3   4   20.0    bb
#5  2019-01-10  7   9   5.0     bb


Как я могу: 1) назначить первое None как среднее для тех же значений даты с тем же типом 'cc' 2) присвоить второе None ближайшей дате с аналогичным типом 'bb'

#      Date     A   B   C      Type
#0  2018-12-29  5   6   5.0     cc
#1  2019-01-05  1   2   7.5     cc
#2  2018-12-29  3   4   10.0    cc
#3  2019-01-01  1   2   20.0    bb
#4  2018-12-29  3   4   20.0    bb
#5  2019-01-10  7   9   5.0     bb

1 Ответ

0 голосов
/ 10 октября 2019

Чтобы сделать общее решение, лучше всего создать функцию и применить ее для каждой группы, используя groupby . Вы можете использовать означает или интерполировать :

def f_fill(x):
    if x.iat[0] == None:
        x.iat[0]=x.iat[1]
    if x.iat[-1] == None:
         x.iar[-1]=x.iat[-2]
    return x.fillna(x.mean())
    #return x.fillna(x.interpolate())

d['C']=d.groupby('Type')['C'].apply(f_fill)
print(d)

         Date  A  B     C Type
0  2018-12-29  5  6   5.0   cc
1  2019-01-05  1  2   7.5   cc
2  2018-12-29  3  4  10.0   cc
3  2019-01-01  1  2  20.0   bb
4  2018-12-29  3  4  20.0   bb
5  2019-01-10  7  9   5.0   bb

для конкретного примера, вы можете сделать это:

d['C']=d.groupby('Type')['C'].apply(lambda x: x.fillna(x.mean()) if x.iat[0] !=None else x.bfill())
print(d)

         Date  A  B     C Type
0  2018-12-29  5  6   5.0   cc
1  2019-01-05  1  2   7.5   cc
2  2018-12-29  3  4  10.0   cc
3  2019-01-01  1  2  20.0   bb
4  2018-12-29  3  4  20.0   bb
5  2019-01-10  7  9   5.0   bb

или с использованием интерполяции:

d['C']=d.groupby('Type')['C'].apply(lambda x: x.fillna(x.interpolate() if x.iloc[0] !=None else x.bfill()))

Это решение действительно, если не более одного None одновременно. Или, если несколько куч None находятся в местах, отличных от первого и последнего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...