Python 使代码更好-列表动态追加
我正在尝试创建一个Df来组合成对的时间vol。因此,我尝试了下面的代码。它正在工作,但是想知道一种更动态地处理list append to DF的方法。任何帮助都将不胜感激。。提前谢谢Python 使代码更好-列表动态追加,python,list,pandas,Python,List,Pandas,我正在尝试创建一个Df来组合成对的时间vol。因此,我尝试了下面的代码。它正在工作,但是想知道一种更动态地处理list append to DF的方法。任何帮助都将不胜感激。。提前谢谢 time = [] for i in (dfeuh,dfguh,dfuch,dfujh,dfauh, dfnuh,dfejh,dfegh,dfgjh,dfuchh,dfgoldh,dfdaxh): a = i.groupby(by='Time
time = []
for i in (dfeuh,dfguh,dfuch,dfujh,dfauh,
dfnuh,dfejh,dfegh,dfgjh,dfuchh,dfgoldh,dfdaxh):
a = i.groupby(by='Time')['Ch Pip H'].mean()
.sort_values(ascending=False).head(1)
time.append(a)
df = pd.DataFrame(time[0])
df1 = pd.DataFrame(time[1])
df2 = pd.DataFrame(time[2])
df3 = pd.DataFrame(time[3])
df4 = pd.DataFrame(time[4])
df5 = pd.DataFrame(time[5])
df6 = pd.DataFrame(time[6])
df7 = pd.DataFrame(time[7])
df8 = pd.DataFrame(time[8])
df9 = pd.DataFrame(time[9])
df10 = pd.DataFrame(time[10])
df11= pd.DataFrame(time[11])
dfto = pd.concat([df,df1,df2,df3,df4,df5,df6,df7,df8,
df9,df10,df11],ignore_index=False)
pairs = ['EU','GU','UC','UJ','AU','NU','EJ',
'EG','GJ','UCH','GOLD','DAX']
dfto['Ch Pip H'] = pairs
dfto = dfto.reset_index()
dfto.set_index(['Ch Pip H'],inplace=True)
col = ['Time Vol Max']
dfto.columns = col
我建议更换这个:
df = pd.DataFrame(time[0])
df1 = pd.DataFrame(time[1])
df2 = pd.DataFrame(time[2])
df3 = pd.DataFrame(time[3])
df4 = pd.DataFrame(time[4])
df5 = pd.DataFrame(time[5])
df6 = pd.DataFrame(time[6])
df7 = pd.DataFrame(time[7])
df8 = pd.DataFrame(time[8])
df9 = pd.DataFrame(time[9])
df10 = pd.DataFrame(time[10])
df11= pd.DataFrame(time[11])
dfto = pd.concat([df,df1,df2,df3,df4,df5,df6,df7,df8,
df9,df10,df11],ignore_index=False)
为此:
dfs = []
for i in range(12):
dfs.append(pd.DataFrame(time[i])
dfto = pd.concat(dfs,ignore_index=False)
根据您的数据的确切外观,可能有一些方法可以做您需要做的事情,甚至不需要使用循环-在使用Pandas时,循环通常是最后的手段,但根据可用的信息,我至少可以说,这与您现有的代码做了相同的事情,但更简洁、更灵活
编辑以添加上述内容的前三行可以进一步简化为:
dfs = [pd.DataFrame(time[i]) for i in range(12)]
据我所知,您想要一种更干净的方法来创建数据帧吗 在这种情况下,您可以使用高阶函数
map
,并将行数减少到一行
data_frames = map(pd.DataFrame, time)
dfto = pd.concat(data_frames, ignore_index=False)
这将为您提供一个数据帧列表,您可以删除所有分别创建DataFrame
s的行。现在,数据帧
应该包括所有这些帧,但只使用一行实现
高阶函数
map
将函数作为第一个参数,在本例中为pd.DataFrame()
,将项目序列作为第二个参数,在本例中为列表time
,并将该函数应用于序列的每个元素,并返回一个列表,其中包含将该函数应用于序列的每个元素的结果。欢迎使用SO!请提供一份报告。如果有什么区别的话,这将允许您轻松判断哪些优化最适合您的用例。“将成对的时间卷放在一起”——请问什么是“时间卷”?还有,什么是“更动态地处理列表附加的方法”?您是在谈论减少代码行数,还是减少运行时间,或者其他什么?谈论减少代码行数。。主要是在下面提到的部分。如果代码没有任何错误,请继续问。太好了!我会测试的。谢谢这正是我想。。我不能给你投票,因为名声不好:/。。无论如何,非常感谢!很高兴我能帮忙。我刚刚意识到,我发布的代码中的前三行实际上可以缩减为一行(参见编辑)。这大大简化了代码。我唯一的评论是,看起来您正在尝试为个人财务数据创建DF。如果情况是这样的,并且你期望有几十个这些数据框,考虑使用DICT而不是列表。您需要平衡内存问题和性能问题,但同样的概念也适用。通过迭代简化逻辑。太好了。再次感谢!!真的很好。O将学习更多关于地图的知识。似乎很有用。谢谢!地图很棒。你可以用地图做的任何事情都可以用列表组件来完成。通常建议您使用列表comp。这并不是说一个最终会比另一个更好,但是python社区中的其他人通常更容易识别它,因此,如果您需要更多帮助,其他人将更愿意阅读/理解您的代码。在其他语言(如JavaScript/函数式语言)中,映射通常是可行的方法。@Matt Map更干净、更简单。我认为我们应该始终追求更干净、更简单的目标。因为您需要在一系列项上调用函数,所以函数就是这样。