Pandas заполнить фрейм данных из другого фрейма данных, где [не] индекс не всегда перекрывается - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть куча фреймов данных, где я хочу вытащить по одному столбцу из каждого и объединить их в другой фрейм данных со столбцом метки времени, который не проиндексирован.

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

[Index] [time]                [col1]   [col2] [etc]
0       2020-04-21T18:00:00Z    1        2     ...

Все кадры данных имеют столбец time и столбец col1. Поскольку столбец 'time' не обязательно перекрывается, я создал новый фрейм данных с объединением всех фреймов данных (которые я добавил в словарь)

di = ... #dictionary of all the dataframes of interest

for key in di:
    temptimeslist = di[key]['time'].tolist()
    fulltimeslist.extend(x for x in temptimeslist if x not in fulltimeslist)

datadf['time'] = fulltimeslist #make a new df and add this as a column

(я уверен, что есть более простой способ сделать выше, любые предложения приветствуются). Обратите внимание, что по ряду причин перевод формата даты-времени ISO в дату-время и установка в качестве индекса неидеального .

Достаточно очевиден тупой способ сделать то, что я хочу:

for key in di:
    datadf[key] = float("NaN")
    tempdf = di[key]  #could skip this probably
    for i in range(len(datadf)):
        if tempdf.time[tempdf.time==datadf.time[i]].index.tolist():
             if len(tempdf.time[tempdf.time==datadf.time[i]].index.tolist())==1: #make sure value only shows up once, could reasonably skip this and put protection in elsewhere
                    datadf.loc[i,key] = float(tempdf[colofinterest][tempdf.time[tempdf.time==datadf.time[i]].index.tolist()])
                    #i guess i could do the above backwards so i loop over only the shorter dataframe to save some time.

но это кажется излишне долгим для python ... Первоначально я пробовал pandas методы слияния и объединения, но получал различные ошибки при их попытке ... то же самое касается операторов "in" внутри операторы if.

например, я пробовал что-то вроде

datadf.join(Nodes_dict[key],datadf['time']==Nodes_dict[key]['time'],how="left").select()

, но это не удалось.

Я думаю, вопрос сводится к следующим шагам:

1) учитывая 2 кадра данных со столбцом строк (раз в формате iso), найдите индексы в большем для того, где они соответствуют более короткому (или наоборот) 2), учитывая этот список индексов, заполните отдельный столбец в большем df, используя значения из меньшего df, но только в правильных точках и nan в противном случае

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