[英]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.