如何使用Python中的pandas重命名DataFrame中的列

3

我有五个股票投资组合,这些组合是从Yahoo! finance导入的,我需要创建一个数据框(DataFrame),其中包含所有股票在2016年的收盘价格。然而,我无法使用相应的股票名称对列进行标记。

import pandas.io.data as web
import pandas_datareader.data as web
import pandas as pd

from pandas import Series, DataFrame
import numpy as np
import datetime

start = datetime.datetime(2016, 1, 1)
end = datetime.datetime(2016, 12, 31)

NFLX = web.DataReader("NFLX", 'yahoo', start, end)
AAPL = web.DataReader("AAPL", 'yahoo', start, end)
GOOGL = web.DataReader("GOOGL", 'yahoo', start, end)
FB = web.DataReader("FB", 'yahoo', start, end)
TSLA = web.DataReader("TSLA", 'yahoo', start, end)

df_NFLX = pd.DataFrame(NFLX['Close'])
df_AAPL = pd.DataFrame(AAPL['Close'])
df_GOOGL = pd.DataFrame(GOOGL['Close'])
df_FB = pd.DataFrame(FB['Close'])
df_TSLA = pd.DataFrame(TSLA['Close'])
frames = [df_NFLX, df_AAPL, df_GOOGL, df_FB, df_TSLA]
result = pd.concat(frames, axis = 1)
result = result.rename(columns = {'Two':'N'})
result

我的代码生成了以下内容,我希望能够相应地为每一列命名标题。

Out[15]: 
                 Close       Close       Close       Close       Close
Date                                                                  
2016-01-04  109.959999  105.349998  759.440002  102.220001  223.410004
2016-01-05  107.660004  102.709999  761.530029  102.730003  223.429993
2016-01-06  117.680000  100.699997  759.330017  102.970001  219.039993
2016-01-07  114.559998   96.449997  741.000000   97.919998  215.649994
2016-01-08  111.389999   96.959999  730.909973   97.330002  211.000000
2016-01-11  114.970001   98.529999  733.070007   97.510002  207.850006
2016-01-12  116.580002   99.959999  745.340027   99.370003  209.970001
2个回答

3

修补你编写的代码的简单方法是只需将名称列表分配给df.columns

df.columns = ['NFLX', 'AAPL', 'GOOGL', 'FB', 'TSLA']

然而,有一些方法可以让你的代码更加简洁,并且可以清晰地将股票名称指定为列名。我建议从头开始(在定义了startend之后),首先创建一个要获取的股票代码列表。

start = datetime.datetime(2016, 1, 1)
end = datetime.datetime(2016, 12, 31)
tickers = ['NFLX', 'AAPL', 'GOOGL', 'FB', 'TSLA']

然后,您可以使用某种循环构建所有数据帧。如果您只想要“Close”列,则可以立即提取该列,并且实际上您可以将所有这些列制作成一个字典,然后直接从该字典构建一个“DataFrame”。

result = DataFrame({t: web.DataReader(t, 'yahoo', start, end)['Close']
                    for t in tickers})

另一种方法是将所有股票数据放入Panel中,如果您可能需要处理其他列,则很有用。
p = pd.Panel({t: web.DataReader(t, 'yahoo', start, end) for t in tickers})

然后你可以使用以下方法提取 Close 数值:
result = p[:,:,'Close']

你会注意到它自动拥有了正确的列标签。

@6114617 很高兴能够帮忙。请注意,我编辑了一些更好的替代方案。 - David Z

2
为了重命名构建表中的列,您可以更改以下内容:
df_NFLX = pd.DataFrame(NFLX['Close'])

转化为:

df_NFLX = pd.DataFrame(NFLX['Close']).rename(columns={'Close': 'NFLX'})

1
这不是完整的答案,但绝对是正确的方法,而不是目前被接受的答案。 - the_constant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接