Объединить столбцы по одному индексу - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь использовать pandas для преобразования файла данных, разделенных табуляцией ~ 500 МБ, в следующем формате:

+-------+---------+-------+---------+-------+---------+
| Time1 | Sensor1 | Time2 | Sensor2 | Time3 | Sensor3 |
+-------+---------+-------+---------+-------+---------+
|     0 | x       |     0 | y       | 0     | z       |
|     1 | x       |     2 | y       | 0.5   | z       |
|     2 | x       |     4 | y       | 1     | z       |
|     3 | x       |       |         | 1.5   | z       |
|     4 | x       |       |         | 2     | z       |
|     5 | x       |       |         | 2.5   | z       |
|       |         |       |         | 3     | z       |
|       |         |       |         | 3.5   | z       |
|       |         |       |         | 4     | z       |
|       |         |       |         | 4.5   | z       |
|       |         |       |         | 5     | z       |
+-------+---------+-------+---------+-------+---------+

Я хотел бы получить все значения датчиков вдоль одной временной оси, например:

+------+---------+---------+---------+
| Time | Sensor1 | Sensor1 | Sensor3 |
+------+---------+---------+---------+
| 0    | x       | y       | z       |
| 0.5  | NaN     | NaN     | z       |
| 1    | x       | NaN     | z       |
| 1.5  | NaN     | NaN     | z       |
| 2    | x       | y       | z       |
| 2.5  | NaN     | NaN     | z       |
| 3    | x       | NaN     | z       |
| 3.5  | NaN     | NaN     | z       |
| 4    | x       | y       | z       |
| 4.5  | NaN     | NaN     | z       |
| 5    | x       | NaN     | z       |
+------+---------+---------+---------+

Я начал со следующего кода. Часть зацикливания работает нормально (хотя это занимает невероятно много времени). Однако часть concat приводит к большому количеству дублированных временных индексов и не объединяет несколько значений датчика в одну строку.

import pandas as pd
dfList = []
numberOfChannels = 3
for x in range(0,numberOfChannels):
    columns = [numberOfChannels]
    frame = pd.read_table('testinput.csv', 
                          usecols = [x*2, x*2+1],
                          index_col = 0)
    frame.index.name = 'time'
    frame.index = pd.to_timedelta(frame.index, unit = 'ms')

    dfList.append(frame)
df = pd.concat(dfList)

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы можете создать список серий, а затем использовать pandas.concat, чтобы объединить их в один фрейм данных.

Решение функционально идентично @DyZ, но выложено по-другому.

series_list = [df.set_index('Time'+str(i))['Sensor'+str(i)].dropna() \
               for i in range(1, int(len(df.columns)/2) + 1)]

res = pd.concat(series_list, axis=1)\
        .rename_axis('Time').reset_index()

Настройка

df = pd.DataFrame({'Time1': [0, 1, 2, 3, 4, 5, np.nan, np.nan, np.nan, np.nan, np.nan],
                   'Sensor1': ['x', 'x', 'x', 'x', 'x', 'x', np.nan, np.nan, np.nan, np.nan, np.nan],
                   'Time2': [0, 2, 4, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                   'Sensor2': ['y', 'y', 'y', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                   'Time3': [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5],
                   'Sensor3': ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']})

Результат

print(res)

    Time Sensor1 Sensor2 Sensor3
0    0.0       x       y       z
1    0.5     NaN     NaN       z
2    1.0       x     NaN       z
3    1.5     NaN     NaN       z
4    2.0       x       y       z
5    2.5     NaN     NaN       z
6    3.0       x     NaN       z
7    3.5     NaN     NaN       z
8    4.0       x       y       z
9    4.5     NaN     NaN       z
10   5.0       x     NaN       z
0 голосов
/ 14 мая 2018

У меня работал следующий код:

df = pd.read_table('testinput.csv')

pd.concat([df[['Time{}'.format(i), 'Sensor{}'.format(i)]]\
           .set_index('Time{}'.format(i)) \
           for i in range(1, numberOfChannels + 1)], axis=1)\
          .dropna(how='all')
#     Sensor1  Sensor2
#0.0      1.0      1.0
#1.0      2.0      NaN
#2.0      1.0      2.0
#3.0      2.0      NaN
#4.0      1.0      1.0
#5.0      2.0      NaN
#6.0      1.0      NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...