Создание Pandas DataFrame из списка или dict всегда возвращает пустой DF - PullRequest
2 голосов
/ 25 апреля 2019

Я пытаюсь создать pandas dataframe из словаря.Ключи словаря - это строки, а значения - 1 или более списков.У меня странная проблема, в которой команда pd.DataFrame () последовательно возвращает пустой фрейм данных, даже когда я передаю ему непустой объект, такой как список или dict.Мой код похож на следующий:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],[2,34,11],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

Поэтому я хочу создать DF, который выглядит следующим образом:

    A  B  C 
ID1 1  2  3
ID2 10 11 12
ID2 2  34 11
ID3 8  3  12

Когда я проверяю содержимое df, я получаю «Пусто»DataFrame ", и если я перебираю его содержимое, я получаю только имена столбцов и никаких данных в myDictionary!Я проверил документацию, и это должна быть простая команда:

pd.DataFrame(dict, columns)

Это не дает мне результат, который я ищу, и я сбит с толку, почему.У кого-нибудь есть идеи?Спасибо!

Ответы [ 6 ]

1 голос
/ 25 апреля 2019

В этой ситуации я бы порекомендовал интерпретировать ваш список списков как строки. Позже, если вам нужно отредактировать или проанализировать любой из них, вы можете использовать синтаксический анализатор для интерпретации столбцов.

См. Ниже рабочий код, который позволяет вам сохранить список списков в кадре данных.

myDictionary = {"ID1":'[1,2,3]', "ID2":'[10,11,12],[2,34,11]',"ID3":'[8,3,12]'}


df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"], index = [0])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)
df.head(3)

Всегда преобразовывая списки в строки, вы сможете объединять их гораздо проще, независимо от того, сколько списков нужно объединить.

1 голос
/ 25 апреля 2019

попробуйте пример ниже, чтобы понять, почему df пуст:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12], 'A':[0, 0, 0]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

и что вы хотите:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary).rename(columns={'ID1':'A', 'ID2':'B', 'ID3':'C'})
0 голосов
/ 26 апреля 2019

Вот один из возможных подходов

Словарь

myDictionary = {"ID1":[1,2,3], "ID2":[[10,11,12],[2,34,11]],"ID3":[8,3,12]}

Получить словарь d, который содержит значения ключей для значений, которые являются вложенными списками, чьи (а) ключи уникальны - используйте суффикс, чтобы ключи этого словаря d были уникальными и (б) чьи значения являются сплюснутыми подсписками из вложенного списка

  • чтобы сделать это, переберите цикл и
    • проверьте , если значение содержит подсписок
      • если это так, добавьте эту пару key:value в отдельный словарь d
        • используйте суффикс для разделения идентичных ключей, поскольку ключ ID2 не может быть повторен в словаре
          • каждый суффикс будет содержать один из подсписков из вложенного списка
        • генерирует список ключей из исходного словаря (в переменной с именем nested_keys myDictionary), значения которого являются вложенными списками
d = {}
nested_keys = []
for k,v in myDictionary.items():
    if any(isinstance(i, list) for i in v):
        for m,s in enumerate(v):
            d[k+'_'+str(m+1)] = s
        nested_keys.append(k)

print(d)
{'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11]}

(Используя список ключей, значения которых являются вложенными списками - nested_keys) Получите второй словарь, который содержит значения, которые не являются вложенными списками - см. этого SO сообщение о том, как это сделать

myDictionary = {key: myDictionary[key] for key in myDictionary if key not in nested_keys}

print(myDictionary)
{'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}

Объедините 2 словаря выше в один словарь

myDictionary = {**d, **myDictionary}

print(myDictionary)
{'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11], 'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}

Преобразовать объединенный словарь в DataFrame и отбросить суффикс, который был добавлен ранее

df = pd.DataFrame(list(myDictionary.values()), index=myDictionary.keys(),
                                                columns=list('ABC'))
df.reset_index(inplace=True)
df = df.replace(r"_[0-9]", "", regex=True)
df.sort_values(by='index', inplace=True)

print(df)
  index   A   B   C
2   ID1   1   2   3
0   ID2  10  11  12
1   ID2   2  34  11
3   ID3   8   3  12
0 голосов
/ 25 апреля 2019

вы не можете создать фрейм данных, в котором уровень двух строк будет таким же, как ваш пример

ID2 10 11 12
ID2 2  34 11

и в то же время, это также верно для словаря, в словаре каждый ключдолжен быть уникальным, но в вашем фрейме данных, как указано ниже, словарь невозможен

0 голосов
/ 25 апреля 2019

Во-первых, в списке [2,34,11] отсутствует имя столбца.Дайте ему имя!

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

df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

Создает фрейм данных на основе вашего словаря.Но тогда вы говорите, что вам нужны только столбцы из вашего словаря с метками «A», «B», «C», которых нет в вашем словаре.

Попробуйте вместо:

df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)
0 голосов
/ 25 апреля 2019

Вы передаете имена «ID1», «ID2» и «ID3» в pd.DataFrame в качестве имен столбцов, а затем указываете пандам использовать столбцы A, B, C. Поскольку столбцов A, B нет, C pandas возвращает пустой DataFrame.Используйте код ниже, чтобы сделать DataFrame:

import pandas as pd

myDictionary = {"ID1": [1, 2, 3], "ID2": [10, 11, 12], "ID3": [8, 3, 12]}
df = pd.DataFrame(myDictionary, columns=["ID1", "ID2", "ID3"])
print(df)

Вывод:

   ID1  ID2  ID3
0    1   10    8
1    2   11    3
2    3   12   12

И более того:

"ID2":[10,11,12],[2,34,11]

Неверно, так как вы пытаетесь либопередать 2 ключа для одного значения в словаре, или забыл сделать ключ для значений [2,34,11].Таким образом, ваш словарь должен возвращать ошибки при попытке компиляции, если вы не удалите этот список.

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