Python 将数据帧放入具有特定格式的词典列表的最有效方法

Python 将数据帧放入具有特定格式的词典列表的最有效方法,python,pandas,list,dictionary,Python,Pandas,List,Dictionary,我有一个包含一列和时间戳索引的熊猫数据帧。数据框的代码如下所示: 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']) dict_list = [] for i in range(

我有一个包含一列和时间戳索引的熊猫数据帧。数据框的代码如下所示:

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'])
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)
我想以某种方式从df的行创建一个字典列表。对于数据帧的每一行,我想创建一个带有键“Timestamp”和“Value”的字典。“Timestamp”键的值将是该行的索引。“value”键的值将是数据框列中的行的值。这些词典中的每一本都将被添加到一个列表中

我知道我可以通过如下方式循环数据帧的所有行来实现这一点:

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'])
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循环之外,还有什么更快、更有效的方法吗?

您需要重命名列,为索引命名并将其转换为列。然后您需要
DataFrame。使用
'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}]

对于较大的数据帧,它比简单的循环快一点,但由于数据量较大,它仍然会变慢

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

这似乎解决了我的问题。非常感谢。