Широкий диапазон данных Pandas против длинных - unstack против pivot против внешнего соединения для MULTIPLE df - PullRequest
0 голосов
/ 20 ноября 2018

Проблема

У меня есть несколько огромных информационных кадров, извлеченных из оборудования, которые отслеживают многократные запуски на указанном оборудовании, каждый из которых записывает несколько датчиков (напряжение, ток, об / мин, давление ... и т. Д.) Мне нужно расширить этонабор данных для построения графика и дальнейшего анализа, но, к сожалению, часы на датчиках не синхронизированы, поэтому разные параметры собираются каждый со своей собственной отметкой времени и могут различаться по длине (мсек, поэтому иногда> 10 строк).

Я попытался расстегнуть:

df.set_index(['index','start_time','param']).value.unstack().rename_axis(None, 1).reset_index()

Поворот:

df.pivot_table(values = 'value', index = ['index','start_time'], columns = 'param')

, но разная длина вызывает реалпроблемы (по понятным причинам).

У меня есть код для преобразования на основе даты (т. е. отдельного прогона) или параметра в словарь dfs, и я могу выполнить анализ каждого прогона или параметра - но есть~ 100 датчиков и 18 месяцев работы (!), Поэтому я хотел бы убедиться, что нет способа сделать то, что я хочу ... что я думаю, что-то вроде внешнего соединения.Из-за различий в длинах необходимо заполнить пробелы NaN - это нормально - и найти максимальную длину любого параметра, чтобы настроить длину даты на.

Набор данных модели

Начало

df_long = pd.DataFrame({"Date" : np.array([1]*5 + [2]*3 + [3]*4 + [4]*2 + [5]*4),
                "Param" : list('aaabbabbabccaaaacc'),
                "value": [0.1, 0.2, 0.2, 1, 4, 0.6, 0.5, 90, 0.9, 8.8, 4.1, 0.4, 0.5, 0.1, 0.1, 0.3, 3.4, 5.1],
               "time" : [1,2,3,1,2,1,1,2,1,1,1,2,1,2,1,2,1,2]
                })

Идеальный вывод

df_wide = pd.DataFrame ({
"Date" : [1,1,1,2,2,3,3,4,4,5,5],
"a": [0.1,0.2,0.2,0.6,'NaN',0.9,'NaN',0.5,0.1,0.1,0.3],
"time-a": [1,2,3,1,'NaN',1,'NaN',1,2,1,2],
"b": [1,4,'NaN',0.5,90,8.8,'NaN','NaN','NaN','NaN','NaN'],
"time-b": [1,2,'NaN', 1,2,1,'NaN','NaN','NaN','NaN','NaN'],
"c": ['NaN','NaN','NaN','NaN','NaN',4.1,0.4,'NaN','NaN',3.4,5.1],
"time-c": ['NaN','NaN','NaN','NaN','NaN',1,2,'NaN','NaN',1,2]})    

Любая помощь с благодарностью

1 Ответ

0 голосов
/ 20 ноября 2018

pd.pivot_table

Вы можете повернуть свой фрейм данных.Единственное отличие от желаемого результата - у вас есть только одна серия time;Вы можете, если хотите, построить time-a, time-b и т. д., учитывая нулевые значения в других рядах.

res = pd.pivot_table(df_long, index=['Date', 'time'],
                     columns=['Param'], values='value').reset_index()

print(res)

Param  Date  time    a     b    c
0         1     1  0.1   1.0  NaN
1         1     2  0.2   4.0  NaN
2         1     3  0.2   NaN  NaN
3         2     1  0.6   0.5  NaN
4         2     2  NaN  90.0  NaN
5         3     1  0.9   8.8  4.1
6         3     2  NaN   NaN  0.4
7         4     1  0.5   NaN  NaN
8         4     2  0.1   NaN  NaN
9         5     1  0.1   NaN  3.4
10        5     2  0.3   NaN  5.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...