Объединение 2 или более фреймов данных и перенос результата - PullRequest
1 голос
/ 02 марта 2020

У меня есть несколько DF, полученных из процесса биндинга Panda с использованием приведенного ниже кода:

df2 = df.resample(rule=timedelta(milliseconds=250))[('diffA')].mean().dropna() 
df3 = df.resample(rule=timedelta(milliseconds=250))[('diffB')].mean().dropna()

.. et c

У каждого DF будет столбец, содержащий «время» в Datetime формат (пример: 2019-11-22 13: 18: 00.000) и второй столбец, содержащий число (т. е. 0,06). Различные DF будут иметь разные «временные» корзины. Я пытаюсь объединить все DF в один, где некоторые элементы результирующего DF могут содержать «NaN». Формат Datetime DFs дает ошибку при использовании;

метод 1) df4=pd.merge(df2,df3,left_on='time',right_on='time')

метод 2) pd.pivot_table(df2, values = 'diffA', index=['time'], columns = 'time').reset_index()

Когда DF объединены, я также хочу транспонировать полученный DF, где:

Строки: «DiffA», «DiffB» и т. Д. Столбцы: соответственно, временные интервалы.

Попробовал метод transpose () с отдельными DF, просто чтобы попробовать, но получаю ошибку, так как мое время / индекс в формате 'Datetime' ..

Как только это будет на месте, Я ищу метод для извлечения строк из полученного транспонированного DF в виде отдельных рядов данных.

Пожалуйста, посоветуйте, как мне достичь этого, с некоторыми рекомендациями, цените любые отзывы! Большое спасибо за вашу помощь.

Фреймы данных (например, 2)

time                     DiffA
2019-11-25 08:18:01.250 0.06
2019-11-25 08:18:01.500 0.05
2019-11-25 08:18:01.750 0.04
2019-11-25 08:18:02.000 0
2019-11-25 08:18:02.250 0.22
2019-11-25 08:18:02.500 0.06
time                        DiffB
2019-11-26 08:18:01.250    0.2
2019-11-27 08:18:01.500    0.05
2019-11-25 08:18:01.000    0.6
2019-11-25 08:18:02.000    0.01
2019-11-25 08:18:02.250    0.8
2019-11-25 08:18:02.500    0.5

В результате объединенный DF должен выглядеть следующим образом (только текст);

time ( first row )   
2019-11-25 08:18:01.000,     
2019-11-25 08:18:01.250,     
2019-11-25 08:18:01.500,     
2019-11-25 08:18:01.750,     
2019-11-25 08:18:02.000,     
2019-11-25 08:18:02.250,     
2019-11-25 08:18:02.500,     
2019-11-26 08:18:01.250,     
2019-11-27 08:18:01.500

(второй ряд)

diffA   nan 0.06    0.05    0.04    0   0.22    0.06    nan nan

(третий ряд)

diffB   0.6 nan nan nan 0.01    0.8 0.5 0.2 0.05

1 Ответ

2 голосов
/ 02 марта 2020

Решение

Базовая логика c: вам нужно использовать external-join в столбце 'time' - merge каждый из выбранных -Датафреймы вместе, чтобы достичь вашей цели. Наконец, сброс индекса в столбец время завершает решение.

Я буду использовать фиктивные данные, которые я создал ниже, для создания воспроизводимого решения.

Примечание : я использовал df в качестве окончательного кадра данных и df0 в качестве исходного кадра данных. Мой df0 ваш df.

df = pd.DataFrame()
for i, column_name in zip(range(5), column_names):
    if i==0:
        df = df0.sample(n=10, random_state=i).rename(columns={'data': f'df{column_name}'})
    else:
        df_other = df0.sample(n=10, random_state=i).rename(columns={'data': f'df{column_name}'})
        df = pd.merge(df, df_other, on='time', how='outer')

print(df.set_index('time').T)

Выход :

enter image description here

Фиктивные данные

import pandas as pd

# dummy data:
df0 = pd.DataFrame()
df0['time'] = pd.date_range(start='2020-02-01', periods=15, freq='D')
df0['data'] = np.random.randint(0, high=9, size=15)
print(df0)

Вывод:

         time  data
0  2020-02-01     6
1  2020-02-02     1
2  2020-02-03     7
3  2020-02-04     0
4  2020-02-05     8
5  2020-02-06     8
6  2020-02-07     1
7  2020-02-08     6
8  2020-02-09     2
9  2020-02-10     6
10 2020-02-11     8
11 2020-02-12     3
12 2020-02-13     0
13 2020-02-14     1
14 2020-02-15     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...