使用for循环构建DataFrame

时间:2017-03-03 21:05:06

标签: python-3.x pandas

我使用以下代码制作一个DataFrame,其中包含两个符号的收盘价,其中列标题分别作为其符号名称。

symbols=['KEL','PAEL']
start_date = '2016-05-01'
end_date = '2017-03-02'
allocation = 50000


def data(symbol):
    dates=pd.date_range(start_date,end_date) 
    df=pd.DataFrame(index=dates)
    df_temp=pd.read_csv('/home/furqan/Desktop/python_data/{}.csv'.format(str(symbol)),usecols=['Date','Close'],
                            parse_dates=True,index_col='Date',na_values=['nan'])
    df_temp = df_temp.rename(columns={'Close': symbol})
    df=df.join(df_temp)
    df=df.fillna(method='ffill')
    df=df.fillna(method='bfill')
    return df

for symbol in symbols: 
    df=data(symbol)
    pass
print(df)

当我运行上面的代码时,它会用新符号覆盖列,而不是在DataFrame中创建其他列。

如果我想为DataFrame中的每个新符号创建新列,如何在不使用函数中的任何for循环的情况下实现该目标。

预期的outoput:

              KEL   PAEL
2016-05-01   7.07  61.74
2016-05-02   7.07  61.74
2016-05-03   7.21  62.19
2016-05-04   7.21  62.72
2016-05-05   7.20  64.24
2016-05-06   7.17  63.88
2016-05-07   7.17  63.88
2016-05-08   7.17  63.88
2016-05-09   7.25  64.12
2016-05-10   7.28  65.59
2016-05-11   7.43  65.78

我得到的输出:

             PAEL
2016-05-01  61.74
2016-05-02  61.74
2016-05-03  62.19
2016-05-04  62.72
2016-05-05  64.24
2016-05-06  63.88
2016-05-07  63.88
2016-05-08  63.88
2016-05-09  64.12
2016-05-10  65.59
2016-05-11  65.78

1 个答案:

答案 0 :(得分:0)

您的问题与此问题非常相似:https://stackoverflow.com/a/42591863/3027854

@ A-Za-z指出的错误是df=data(symbol)您覆盖了数据框,因此您丢失了KEL的数据,只剩下PAEL。< / p>

基本上,您需要保留data(symbol)方法返回的数据帧。并且晚点合并它们。

示例:

symbols=['one', 'two']
start_date = '2016-05-01'
end_date = '2017-03-02'
allocation = 50000


def data(symbol):
    dates=pd.date_range(start_date, end_date) 
    df=pd.DataFrame(index=dates)
    df_temp=pd.read_csv('{}.csv'.format(str(symbol)),usecols=['Date','Close'],
                            parse_dates=True,index_col='Date',na_values=['nan'])
    df_temp = df_temp.rename(columns={'Close': symbol})
    df = df.join(df_temp)
    df = df.fillna(method='ffill')
    df = df.fillna(method='bfill')
    return df

all_dataframes = []
for symbol in symbols: 
    all_dataframes.append(data(symbol))

df = pd.concat(all_dataframes, axis=1)

输出:

          one   two
2016-05-01  b   f
2016-05-02  d   f
2016-05-03  d   h
2016-05-04  d   h

one.csv:

Date,Close
2016-05-01,b
2016-05-02,d

two.csv:

Date,Close
2016-05-01,f
2016-05-03,h

这4行应该可以解决这个问题:

all_dataframes = []
    for symbol in symbols: 
        all_dataframes.append(data(symbol))

    df = pd.concat(all_dataframes, axis=1)