繁体   English   中英

将一系列dict和concat转换为dataframe

[英]Convert series of dict and concat to dataframe

我的 dataframe

                             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)

将结果与原始 dataframe 连接起来

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

我相信第一部分的for循环是瓶颈。 有没有更快的方法将系列转换为 dataframe 并将其连接回原始 dataframe。

预期 output:

                 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

试试这个更柱状的解决方案。 它假设字典中总是有“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')

看起来迭代所有 df 是不可避免的。 我不确定它是否更好,但我知道 pandas 这样做的方法是使用iterrows()

在文档中,他们还提到了针对特定用例的itertuples() ,但同样,我在这里不是专家。

希望这可以帮助!

测试数据:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM