Массивы грести в пандах - PullRequest
0 голосов
/ 24 августа 2018

У меня есть следующий диктант, который я хочу преобразовать в панд. этот dict имеет вложенный список, который может отображаться для одного узла, но не для другого.

dis={"companies": [{"object_id": 123,
                           "name": "Abd ",
                           "contact_name": ["xxxx",
                                                                       "yyyy"],
                           "contact_id":[1234,
                                                                     33455]
                           },
                          {"object_id": 654,
                           "name": "DDSPP"},
                          {"object_id": 987,
                           "name": "CCD"}
                          ]}

AS

object_id, name, contact_name, contact_id
123,Abd,xxxx,1234
123,Abd,yyyy,
654,DDSPP,,
987,CCD,,

Как я могу достичь этого

Я пытался сделать как

abc = pd.DataFrame(dis).set_index['object_id','contact_name']

но там написано

объект 'method' не может быть подписан

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Если вам нужно преобразовать только один столбец, вы можете использовать что-то более короткое, например:

df = pd.DataFrame(d['companies'])
d = df.loc[0].apply(pd.Series)
d[1].fillna(d[0], inplace=True)
df.drop([0],0).append(d.T)

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

0 голосов
/ 24 августа 2018

Это вдохновлено ответом @jezrael по этой ссылке: Разделение нескольких столбцов на строки в панде dataframe

Использование:

s = {"companies": [{"object_id": 123,
                       "name": "Abd ",
                       "contact_name": ["xxxx",
                                                                   "yyyy"],
                       "contact_id":[1234,
                                                                 33455]
                       },
                      {"object_id": 654,
                       "name": "DDSPP"},
                      {"object_id": 987,
                       "name": "CCD"}
                      ]}
df = pd.DataFrame(s) #convert into DF
df = df['companies'].apply(pd.Series) #this splits the internal keys and values into columns
split1 = df.apply(lambda x: pd.Series(x['contact_id']), axis=1).stack().reset_index(level=1, drop=True)
split2 = df.apply(lambda x: pd.Series(x['contact_name']), axis=1).stack().reset_index(level=1, drop=True)
df1 = pd.concat([split1,split2], axis=1, keys=['contact_id','contact_name'])
pd.options.display.float_format = '{:.0f}'.format
print (df.drop(['contact_id','contact_name'], axis=1).join(df1).reset_index(drop=True))

Вывод с регулярным индексом:

    name  object_id  contact_id contact_name
0   Abd         123        1234         xxxx
1   Abd         123       33455         yyyy
2   DDSPP       654         nan          NaN
3   CCD         987         nan          NaN

Это то, что вы искали?

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