我使用以下代码制作一个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
答案 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)