#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У нас есть список списков:
[['130', '2020-12-17 12:02:19', [52.1846976, 21.0525275]], ['213', '2020-12-17 12:02:22', [52.1757618, 21.2319711]]
и хотите преобразовать его в фрейм данных как таковой:
index 2020-12-17 12:02:19 2020-12-17 12:02:22
130 [52.1846976, 21.0525275] NaN
213 NaN [52.1757618, 21.2319711]
Не могу понять.
Ответ №1:
Вы можете преобразовать свой список в список dict, а затем явно предоставить индекс конструктору:
In [1]: import pandas as pd
In [2]: data = [['130', '2020-12-17 12:02:19', [52.1846976, 21.0525275]], ['213', '2020-12-17 12:02:22', [52.1757618, 21.2319711]]]
In [3]: pd.DataFrame([{col: val} for _, col, val in data], index=[item[0] for item in data])
Out[3]:
2020-12-17 12:02:19 2020-12-17 12:02:22
130 [52.1846976, 21.0525275] NaN
213 NaN [52.1757618, 21.2319711]
Комментарии:
1. мое первое решение было похоже на это, но мне не нравилось вызывать список дважды. интересно, выдаст ли он ту же ошибку для повторяющихся индексов
2. @Manakin это не должно
3. только что протестировано, это не очень приятно.
Ответ №2:
Это не самое сексуальное решение, но экономит любую предварительную обработку за пределами pandas.
Лучшим решением было бы структурировать входные данные в источнике, прежде чем перемещать их в pandas.
d = [['130', '2020-12-17 12:02:19', [52.1846976, 21.0525275]], ['213', '2020-12-17 12:02:22', [52.1757618, 21.2319711]]]
df = pd.DataFrame(d).set_index([0,1]).unstack(1).droplevel(0,1).rename_axis(None)
print(df)
1 2020-12-17 12:02:19 2020-12-17 12:02:22
130 [52.1846976, 21.0525275] NaN
213 NaN [52.1757618, 21.2319711]
—
обработка повторяющихся ключей.
df = pd.DataFrame(d).set_index([0,1])
df = df.set_index(df.groupby(level=[0,1]).cumcount(),append=True).unstack(1)
1 2020-12-17 12:02:19 2020-12-17 12:02:22
130 0 [52.1846976, 21.0525275] NaN
1 [52.1846976, 21.0525275] NaN
213 0 NaN [52.1757618, 21.2319711]
Комментарии:
1. Привет, спасибо за ваше решение, проблема в том, что у меня есть несколько записей с одинаковым номером индекса и разным временем, и ваше решение выдает мне ошибку ValueError: индекс содержит повторяющиеся записи, не может изменить форму
2. @wychen Я предлагаю использовать ответ juanpa.arrivillaga. Решением здесь было бы создать суррогатный индекс для обработки повторяющихся ключей (в индексе), но это быстро приведет к беспорядку.
Ответ №3:
Вам нужно преобразовать список в этот формат:
{'130': {'2020-12-17 12:02:19': [52.1846976, 21.0525275]},
'213': {'2020-12-17 12:02:22': [52.1757618, 21.2319711]}}
затем применитесь pd.DataFrame
к нему.
Попробуйте:
u = {i[0]:{i[1]: i[2]} for i in l}
df = pd.DataFrame(u).T
2020-12-17 12:02:19 2020-12-17 12:02:22
130 [52.1846976, 21.0525275] NaN
213 NaN [52.1757618, 21.2319711]
Ответ №4:
import pandas as pd
data = [['130', '2020-12-17 12:02:19', [52.1846976, 21.0525275]], ['213', '2020-12-17 12:02:22', [52.1757618, 21.2319711]]]
df = pd.DataFrame.from_records(data, columns=['a', 'b', 'c'])
df = df.set_index('a')
df
b c
a
130 2020-12-17 12:02:19 [52.1846976, 21.0525275]
213 2020-12-17 12:02:22 [52.1757618, 21.2319711]
Ответ №5:
Сначала вы можете преобразовать список в фрейм данных. И используйте set_index()
для установки первого столбца в качестве индекса.
Комментарии:
1. импортируйте pandas как данные pd = [[‘130’, ‘2020-12-17 12:02:19’, [52.1846976, 21.0525275]], [‘213’, ‘2020-12-17 12:02:22’, [52.1757618, 21.2319711]]] df = pd.DataFrame.from_records(данные)