Разнесите несколько кумнов с помощью столбцов списка разных размеров в pandas - PullRequest
2 голосов
/ 22 марта 2020

У меня есть следующая ситуация, когда я могу получить 300 столбцов в CSV-файле, и некоторые из них являются параметрами списка (50 столбцов), и они могут иметь неравномерный размер, в том числе без значений.

    Time               COL1                        COL2
2020-03-13 10:43:00.500  0.0 10.0 20.0 30.0 40.0   50.0 60.0 70.0 80.0 90.0
2020-03-13 10:43:00.900  10.0 20.0 30.0 70.0       10.0 20.0
2020-03-13 10:44:00.100  10.0 20.0 30.0 70.0   

Я хочу сделать
1. Разбить столбец на основе наибольшей частоты для строк. Например: максимальная частота 1-й строки (значения, разделенные пробелами) равна 5, а во 2-й строке - 4

Time                  COL1      COL2
2020-03-13 10:43:00.500   0.0    50.0
2020-03-13 10:43:00.580   10.0   60.0
2020-03-13 10:43:00.660   20.0   70.0
2020-03-13 10:43:00.740   30.0   80.0
2020-03-13 10:43:00.820   40.0   90.0    
2020-03-13 10:43:00.900   10.0   10.0 
2020-03-13 10:43:00.1150  20.0   20.0 
2020-03-13 10:43:00.1400  30.0 
2020-03-13 10:43:00.1650  80.0 
2020-03-13 10:44:00.100   10.0 
2020-03-13 10:44:00.350   20.0 
2020-03-13 10:44:00.600   30.0
2020-03-13 10:44:00.850   70.0

и Время подачи должно быть между двумя последующими временами строки. что-то вроде этого.

curr_row_time = data_frame ['Time'] [ind1]
next_row_time = data_frame ['Time'] [ind1 + 1] timestamp1 = datetime.datetime.strptime (str (curr_row_time), '% Y- % m-% d% H:% M:% S.% f ') timestamp2 = datetime.datetime.strptime (str (next_row_time),'% Y-% m-% d% H:% M:% S.% f ') time_delta = (timestamp2 - timestamp1) .total_seconds () * 1000 time_step_increment = time_delta / max_frequency (должно быть max для строки), для максимальной частоты последней строки может быть взято либо среднее значение последней частоты, либо последняя использованная максимальная частота. Примите во внимание любое предложение для пункта 1, однако, 2-й пункт имеет второй приоритет, но хорошо иметь его также.

Для пункта 1 я использовал ниже

Я попробовал решение, упомянутое ниже ссылки путем преобразования пробела, разделенного на список 10,0 20,0 30,0 70,0 ----> [10,0, 20,0, 30,0, 70,0] Pandas Разнесение по нескольким столбцам

 File "<stdin>", line 3, in <listcomp>
  File "<__array_function__ internals>", line 6, in concatenate
ValueError: zero-dimensional arrays cannot be concatenated

Ниже работает ссылки для столбца списка одинакового размера Разбить (взорвать) pandas запись строки кадра данных на отдельные строки

1 Ответ

1 голос
/ 22 марта 2020

Сначала вы можете создать разнесенные столбцы, как хотите, с помощью concat, str.split и stack. Используйте reset_index и join, чтобы иметь возможность связать столбец «Время». Затем вам нужно изменить значения в столбце «Время», чтобы создать интерполяцию. Я не уверен, что можно напрямую интерполировать столбец datetime, но вы можете изменить тип на int64, mask значения, если они совпадают с предыдущей строкой с shift и interpolate. Вот так:

l_col = ['COL1', 'COL2']

df_f = pd.concat([df[col].str.split(' ', expand=True) for col in l_col ], 
                 axis=1, keys=l_col)\
         .stack()\
         .reset_index(level=1, drop=True)\
         .join(df[['Time']])\
         .reset_index(drop=True)

df_f['Time'] = pd.to_datetime(df_f['Time'].astype('int64')
                                          .mask(df_f.Time.eq(df_f.Time.shift()))
                                          .interpolate(method='linear'))

print (df_f)
    COL1  COL2                    Time
0    0.0  50.0 2020-03-13 10:43:00.500
1   10.0  60.0 2020-03-13 10:43:00.580
2   20.0  70.0 2020-03-13 10:43:00.660
3   30.0  80.0 2020-03-13 10:43:00.740
4   40.0  90.0 2020-03-13 10:43:00.820
5   10.0  10.0 2020-03-13 10:43:00.900
6   20.0  20.0 2020-03-13 10:43:15.700
7   30.0  None 2020-03-13 10:43:30.500
8   70.0  None 2020-03-13 10:43:45.300
9   10.0       2020-03-13 10:44:00.100
10  20.0  None 2020-03-13 10:44:00.100
11  30.0  None 2020-03-13 10:44:00.100
12  70.0  None 2020-03-13 10:44:00.100

Я не уверен, что вы хотите для отсутствующих значений в COL2, например, поэтому вам может понадобиться немного fillna, чтобы решить это.

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