Как отобразить значения из нескольких панелей данных Pandas на основе определенных условий, включая DateTime? - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть 2 кадра данных панд, df_pe и df_merged.Оба кадра данных имеют несколько строк, а также несколько столбцов.Теперь есть несколько конкретных вещей, которые я хотел бы выполнить, используя эти кадры данных:

  1. В df_merged есть столбец с именем ST, который содержит метки времени различных событий в формате, например.(2017-08-27 00:00:00)df_pe есть 2 столбца Ton и Toff, которые содержат время начала и окончания события.Например.(Ton значение для случайной строки: 2018-08-17 01:20:00, в то время как Toff значение 2018-08-17 02:30:00).
  2. Во-вторых, в df_pe есть столбец, а именно EC.У меня есть другой фрейм данных с именем df_uniqueal, в котором также есть столбец с именем EC.Я хотел бы сделать следующее:

    a.Для всех строк в df_merged, если значение ST находится в пределах Ton и Toff в df_pe, создайте 2 новых столбца в df_merged: EC и ED.Добавьте / поместите значение EC из фрейма данных df_pe в этот новый столбец, в то время как поместите значение фрейма данных df_uniqueal в новый столбец ED (который в конечном итоге является отображенной версией * 1036).* в df_pe для получения ED в df_uniqueal).Если ни одно из условий не соответствует / после этой процедуры осталось NaN s (пропущенных значений), поместите строку "NF" в новый столбец df_merged ED, а целое число 0 в *Новый столбец 1045 * EC.

Я исследовал SO и SE, но не нашел ничего существенного.Любая помощь в этом отношении высоко ценится.

Это моя попытка использовать циклы for в Python для перебора кадров данных для выполнения первого условия, но оно выполняется вечно (никогда не заканчивается), и я недумаю, что это самый лучший способ сделать это.

for i in range(len(df_merged)):
    for j in range(len(df_pe)):
        if df_pe.TOn[j] < df_merged.ST[i] < df_pe.TOff[j]:
            df_merged.EC[i] = df_pe.EC[j]
            df_merged.ED[i] = df_uniqueal.ED[df_processed.EC[j]]
        else:

            df_merged.EC[i] = 0
            df_merged.ED[i] = "NF"

РЕДАКТИРОВАТЬ Пожалуйста, обратитесь к изображению для ожидаемого результата и детского примера данных. Expected Output and Baby Example

Соответствующие столбцы выделены жирным шрифтом (обратите внимание, что номера столбцов могут отличаться, но имена столбцов в этом примере примера совпадают).

1 Ответ

0 голосов
/ 12 апреля 2019

Если я правильно понял вопрос, надеюсь, это поможет вам начать.

for i,val in df_merged['ST'].items():
    bool_idx = (df_pe['TOn']<val)&(val<df_pe['Toff'])
    if df_pe[bool_idx]['EC'].empty:
       df_merged.loc[i,'EC']=0
       df_merged.loc[i,'ED']="NF"
    else:
       value_from_df_pe = df_pe[bool_idx]['EC']
       df_merged.loc[i,'EC']= value_from_df_pe
       value_from_df_uniqueal = df_uniqueal[df_uniqueal['EC']==value_from_df_pe]['EC']
       df_merged.loc[i,'ED']= value_from_df_uniqueal

Обратите внимание, что я проверял этот код на любых данных.

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