【问题标题】:Convert series of dict and concat to dataframe将一系列 dict 和 concat 转换为数据帧
【发布时间】:2019-10-14 20:53:28
【问题描述】:

我的数据框

                             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'}}

使用post 中的第二个答案,我可以将系列转换为数据框。 问题是如何扩展该操作,因为它发生在每一行上,

目前的做法:

遍历每一行并将它们连接成一个系列(非常慢)

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

【问题讨论】:

  • 我不确定您到底想达到什么目标。可以添加预期的输出吗?是这样的吗:df = pd.concat([df.drop(['Items'], axis=1), df['Items'].apply(pd.Series)], axis=1)
  • 添加了预期输出

标签: python pandas dataframe concatenation


【解决方案1】:

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

【讨论】:

  • 哇,你的代码比我的快 6 倍,在 Python 级别,在列与行上循环是诀窍
【解决方案2】:

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

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

希望这会有所帮助!

【讨论】:

    【解决方案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
    

    【讨论】:

    • 添加了预期的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2017-04-01
    • 1970-01-01
    • 2019-09-27
    • 2023-03-23
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多