【问题标题】:Most efficient way to place a Pandas data frame into a list of dictionaries with a certain format将 Pandas 数据框放入具有特定格式的字典列表中的最有效方法
【发布时间】:2020-12-19 04:33:37
【问题描述】:

我有一个 Pandas 数据框,其中包含一列和一个时间戳索引。数据框的代码如下所示:

import pandas as pd
indx = pd.date_range(start = '12-12-2020 06:00:00',end = '12-12-2020 06:02:00',freq = 'T')
df = pd.DataFrame(data = [0.2,0.4,0.6],index = indx,columns = ['colname'])

我想以某种方式从 df 的行创建一个字典列表。对于数据框的每一行,我想用键“时间戳”和“值”创建一个字典。 “时间戳”键的值将是该行的索引。 “Value”键的值将是数据框列中行的值。这些字典中的每一个都将附加到一个列表中。

我知道我可以通过像这样遍历数据框的所有行来做到这一点:

dict_list = []
for i in range(df.shape[0]):
    new_dict = {'Timestamp': df.index[i],'Value': df.iloc[i,0]}
    dict_list.append(new_dict)

但是,我实际使用的数据框可能非常大。除了使用 for 循环之外,还有更快、更有效的方法吗?

【问题讨论】:

    标签: python pandas list dictionary


    【解决方案1】:

    您需要重命名您的列并为您的索引命名并将其转换为列。然后你想要DataFrame.to_dict 使用'records' ('r') 方向。

    df = df.rename(columns={'colname': 'Value'}).rename_axis(index='Timestamp').reset_index()
    
    dict_list = df.to_dict('records')
    #[{'Timestamp': Timestamp('2020-12-12 06:00:00'), 'Value': 0.2},
    # {'Timestamp': Timestamp('2020-12-12 06:01:00'), 'Value': 0.4},
    # {'Timestamp': Timestamp('2020-12-12 06:02:00'), 'Value': 0.6}]
    

    对于较大的 DataFrame,它比简单的循环要快一些,但由于事情很大,它仍然会变慢

    import perfplot
    import pandas as pd
    import numpy as np
    
    def loop(df):
        dict_list = []
        for i in range(df.shape[0]):
            new_dict = {'Timestamp': df.index[i],'Value': df.iloc[i,0]}
            dict_list.append(new_dict)
        return dict_list
            
            
    def df_to_dict(df):
        df = df.rename(columns={'colname': 'Value'}).rename_axis(index='Timestamp').reset_index()
        return df.to_dict('records')
    
    perfplot.show(
        setup=lambda n: pd.DataFrame({'colname': np.random.normal(0,1,n)},
                                     index=pd.date_range('12-12-2020', freq = 'T', periods=n)),
        kernels=[
            lambda df: loop(df),
            lambda df: df_to_dict(df),
        ],
        labels=['Loop', 'df.to_dict'],
        n_range=[2 ** k for k in range(20)],
        equality_check=None,
        xlabel='len(df)'
    )
    

    【讨论】:

    • 这似乎解决了我的问题。谢谢。
    猜你喜欢
    • 2020-07-27
    • 2021-01-01
    • 1970-01-01
    • 2021-03-23
    • 2019-05-03
    • 1970-01-01
    • 2016-01-15
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多