Преобразовать словарь вложенных списков в панду DataFrame - PullRequest
0 голосов
/ 16 мая 2018

У меня есть словарь Python, как показано ниже:

dict1={808: [['a', 5.4, 'b'],
  ['c', 4.1 , 'b'],
  ['d', 3.7 , 'f']]} 

Я хочу преобразовать его во фрейм данных, как показано ниже:

memberid  userid score related
808       a      5.4     b
808       c      4.1     b
808       d      3.7     f

Я пытался с кодом ниже:

df=pd.DataFrame.from_dict(dict1,orient='index')

Результат не тот, который я хотел.

Может кто-нибудь знать, как это исправить? Спасибо!

Ответы [ 3 ]

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

Использование pd.Series пару раз

df=pd.Series(dict1).apply(pd.Series).stack().apply(pd.Series).reset_index().drop('level_1',1)
df.columns=['memberid','userid', 'score', 'related']
df
Out[626]: 
   memberid userid  score related
0       808      a    5.4       b
1       808      c    4.1       b
2       808      d    3.7       f
0 голосов
/ 16 мая 2018

Ввод значений вашего словаря в pd.DataFrame является односторонним.

Здесь мы используем синтаксис next(iter(some_view)) для извлечения единственного ключа и единственного значения.

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

df = pd.DataFrame(next(iter(dict1.values())), columns=['userid', 'score', 'related'])\
       .assign(memberid=next(iter(dict1.keys())))

print(df)

  userid  score related  memberid
0      a    5.4       b       808
1      c    4.1       b       808
2      d    3.7       f       808
0 голосов
/ 16 мая 2018

Давайте преобразуем каждое значение вложенного списка в DataFrame, а затем вызовем pd.concat.

columns = ['userid', 'score', 'related']

df_dict = {k : pd.DataFrame(v, columns=columns) for k, v in dict1.items()}

df = (pd.concat(df_dict)
        .reset_index(level=1, drop=True)
        .rename_axis('memberid')
        .reset_index()
)

Или аналогичным образом -

df = pd.concat([
       pd.DataFrame(v, columns=columns, index=np.repeat(k, len(v))) 
       for k, v in dict1.items()
  ]
).rename_axis('memberid').reset_index()

df

   memberid userid  score related
0       808      a    5.4       b
1       808      c    4.1       b
2       808      d    3.7       f 

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

k, v = list(dict1.items())[0]
pd.DataFrame(v, columns=columns, index=np.repeat(k, len(v))).reset_index()

   index userid  score related
0    808      a    5.4       b
1    808      c    4.1       b
2    808      d    3.7       f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...