为了账号安全,请及时绑定邮箱和手机立即绑定

将一系列 dict 和 concat 转换为数据帧

将一系列 dict 和 concat 转换为数据帧

芜湖不芜 2022-06-22 18:08:01
我的数据框                             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'}}使用这篇文章的第二个答案允许我将系列转换为数据框。问题是如何扩展该操作,因为它发生在每一行,目前的做法:循环遍历每一行并将它们连接成一个系列(非常慢)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   10321  2019-09-01T14:52:24  336 1763523  528012  1032   1032
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

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


查看完整回答
反对 回复 2022-06-22
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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

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

希望这可以帮助!


查看完整回答
反对 回复 2022-06-22
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

测试数据:


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


查看完整回答
反对 回复 2022-06-22
  • 3 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信