循环zip,附加在Python中

时间:2017-03-30 14:11:20

标签: python python-2.7 pandas zip append

我在python中喋喋不休...

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

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

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

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

它可能看起来像什么

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... 

我正在使用熊猫数据帧。

非常感谢!

2 个答案:

答案 0 :(得分:0)

这可能会通过更改您获取数据的格式来简化,但这里有一个示例可以帮助您顺利完成。我完全不采用拉链方法,而是采用更多的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()之后但在将其放入数据帧之前检查该条件。

答案 1 :(得分:0)

这是你有什么问题吗?只需使用' *'将列表列表传递给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 - use list as function parameters