Как преобразовать список списков в фрейм данных, где первым элементом является индекс, вторым — имя столбца

#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(данные)