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)'
)
这似乎解决了我的问题。非常感谢。