Конвертировать серии в словаре и конкат - PullRequest
1 голос
/ 14 октября 2019

Мой фрейм данных

                             Items  Count  ScannedCount  
0  {'comp': {'S': '2019-08-02'}...   1032          1032 
1  {'comp': {'S': '2019-08-27'}...   1032          1032  

Серия элементов выглядит следующим образом

{'comp': {'S': '2019-08-02T16:54:55.035196+03:00'}, 'ID': {'S': '336'}, 'dID': {'S': '1763523'}, 'fname': {'S': '558012'}}

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

Текущий подход:

Циклически проходить по каждой строке и объединять их в серии (очень медленно)

item_df = pd.DataFrame(df['Items'].iloc[i]) for i in range(df.shape[0])]).reset_index(drop=True), df], axis=1)

Согласуйте результаты с исходным фреймом данных

df = pd.concat([temp, df], axis=1)

Я считаю, что цикл for в первой части является узким местом. Существует ли более быстрый способ преобразования ряда в информационный кадр и его преобразования в исходный информационный кадр.

Ожидаемый результат:

                 comp   ID  dID      fname   Count  ScannedCount  
0  2019-08-02T16:54:55  336 1763523  548012  1032   1032
1  2019-09-01T14:52:24  336 1763523  528012  1032   1032

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Попробуйте это более колоночное решение. Он работает с предположением, что в словаре всегда есть ключ 'S'.

df_tmp = df['Items'].apply(pd.Series)
for c in df_tmp.columns:
    df[c] = df_tmp[c].apply(lambda x: x.get('S'))
df = df.drop(columns='Items')
0 голосов
/ 15 октября 2019

данные испытаний:

import pandas as pd
test_data = {'item' : [{'comp': {'S': '2019-08-02T16:54:55.035196+03:00'}, 'ID': {'S': '336'}, 'dID': {'S': '1763523'}, 'fname': {'S': '558012'}}, {'comp': {'S': '2019-09-02T16:54:55.035196+03:00'}, 'ID': {'S': '336'}, 'dID': {'S': '1763523'}, 'fname': {'S': '558012'}}], 'Count': [1032,1032], 'ScannedCount':[1032,1032]}

df = pd.DataFrame.from_dict(test_data)

Out[64]:  
                                                    item  Count  ScannedCount
    0  {'comp': {'S': '2019-08-02T16:54:55.035196+03:...   1032          1032
    1  {'comp': {'S': '2019-09-02T16:54:55.035196+03:...   1032          1032

Насколько я понимаю, вы пытаетесь получить что-то вроде этого:

def extract(row):

    item_series = pd.Series({k:v for k,v in row['item'].items()})
    result = row.append(item_series)

    return result

df = df.apply(extract, axis = 1)

Это дает вам:

Out[67]: 
                                            comp            ID               dID  \
    0  {'S': '2019-08-02T16:54:55.035196+03:00'}  {'S': '336'}  {'S': '1763523'}   
    1  {'S': '2019-09-02T16:54:55.035196+03:00'}  {'S': '336'}  {'S': '1763523'}   

             fname  
    0  {'S': '558012'}  
    1  {'S': '558012'}  

## skipped some columns for clarity
0 голосов
/ 14 октября 2019

Похоже, итерации по всем df неизбежны. Я не уверен, что это лучше, но я знаю, что панда может сделать это, используя iterrows().

В документах они также упоминают itertuples() для конкретных случаев использования, но, опять же, я здесь не эксперт.

Надеюсь, это поможет!

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