繁体   English   中英

循环zip,附加在Python中

[英]Loop zip, append in Python

我在python中遇到了什么......

我有一个函数,当我输入一个日期时,它给我一个30列价格(每行一个)和索引30名称的列。

[in] getPrice('14/07/2015')

[out]
apple   10
pear    20
orange  12
banana  23
etc... 

水果的数量是相同的。 我想要做的是,循环这个功能,以获得一个大的文件与我在列表中的所有日子的这些水果的价格。 使用ZIP功能我真的不明白它是如何工作的,并且使用追加功能它不会“压缩”价格,这意味着它每次重新创建索引等等。任何想法? 我有一个列表,其中包含我所有的日期,索引一直都是一样的,没有其他水果可用或消失。

它可能看起来像什么

Def Alltogether():
    Alltogether = []
    x = HistoricalDates
    For _ in Historicaldates :
        k = getPrice.... 

然后我阻止......

我最终想要的东西

print Alltogether

[out]
apple   10 40 60 20 ...
pear    20 20 20 20 ...
orange  12 13 14 29 ...
banana  23 14 41 54 ...
etc... 

我正在使用熊猫数据帧。

非常感谢你!

这可能会通过更改您获取数据的格式来简化,但这里有一个示例可以帮助您顺利完成。 我完全不采用拉链方法,而是采用更多的Pandas方式。 为了测试,我创建了一个虚拟函数来返回固定产品集的随机价格:

import pandas as pd
def getPrice(date):
    return pd.Series(np.random.randn(5), index=['apple', 'pear', 'orange', 'nanner', 'etc...'])

然后我们可以创建一个带有一些日期的pandas数据帧:

df = pd.DataFrame( pd.date_range('1/1/2017', periods=3, freq='D') )
df.columns=['MyDate'] # name the date column

这给了我们一个简单的df,有3个日期:

      MyDate
0 2017-01-01
1 2017-01-02
2 2017-01-03

虽然迭代行比某些应用函数稍微不那么惯用,但我认为它非常易读且易于理解,只需迭代日期,获取价格,然后将它们推送到新的数据框中,并将列命名为日期。 鉴于你的问题,我怀疑这是你想要的输出。

outputDF = pd.DataFrame() ## dump results into this df

for index, row in df.iterrows(): #iterate through every row of the date df
    outputDF[row.MyDate] = getPrice(row.MyDate) #shove values into output

这给了我们一个漂亮的df像这样:

        2017-01-01  2017-01-02  2017-01-03
apple     0.150646    0.209668    0.398204
pear      0.131142    0.046473   -0.261545
orange    0.822508    0.456384   -0.774957
nanner   -0.996102   -0.260049   -0.558503
etc...    0.622459   -0.173556   -0.681957

根据您对处理日期无效的情况的评论,有几种方法可以解决这个问题。 如果getPrice()函数在向它传递错误日期时抛出错误,则可以使用try/except

try:
    getPrice(date)
except:
    # do something else... return nulls maybe?

如果错误的日期不会抛出错误,而是返回空值或空列表,那么只需在调用getPrice()但在将其放入数据帧之前检查该条件。

这是你有什么问题吗? 只需使用'*'将列表列表传递给zip()即可。 这是一个例子:

L1=['L1-i1','L1-i2', 'L1-i3', 'L1-i4']
L2=['L2-i1','L2-i2', 'L2-i3', 'L2-i4']
L3=['L3-i1','L3-i2', 'L3-i3', 'L3-i4']

Lalltogether = [L1, L2, L3]

# in Python 3 you should use list() for zip(): 
print( list(zip( *Lalltogether )) )
print( list(zip(  L1, L2, L3   )) )

得到:

[('L1-i1', 'L2-i1', 'L3-i1'), ('L1-i2', 'L2-i2', 'L3-i2'), ('L1-i3', 'L2-i3', 'L3-i3'), ('L1-i4', 'L2-i4', 'L3-i4')]

有关'*'的更多信息,请参阅Python - 使用list作为函数参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM