Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使代码更好-列表动态追加_Python_List_Pandas - Fatal编程技术网

Python 使代码更好-列表动态追加

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

我正在尝试创建一个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')['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更干净、更简单。我认为我们应该始终追求更干净、更简单的目标。因为您需要在一系列项上调用函数,所以函数就是这样。