追加数据框
Append dataframe
我正在尝试从 Tiingo 获取股票价格并附加数据帧
data = pd.DataFrame()
lis=[
"AAPL",
"MSFT",
"AMZN",
"GOOGL",
"TSLA",
"GOOG",
"NVDA",
"FB",
"JPM",
"BAC",
"ADBE",
"MA",
"PFE",
"DIS",
"NFLX",
"INTC",
"VZ",
"MO"
]
for i in lis:
data =data.append(client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10'))
然而,结果显示有点不同:
AAPL MFST
2020-03-01 100 NAN
2020-03-02 101 NAN
2020-03-03 103 NAN
... NAN
2021-12-10 120 NAN
2020-03-01 NAN 600
2020-03-02 NAN 400
2020-03-03 NAN 300
... NAN
2021-12-10 NAN 1100
我怎样才能让它看起来像这样:
AAPL MFST
2020-03-01 100 600
2020-03-02 101 400
2020-03-03 103 300
...
2021-12-10 120 1100
append 方法追加新行。这正是您所看到的结果。您需要加入而不是追加。
试试这个:
new_data = client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10')
data.join(new_data)
df.join() 方法的文档可在此处获得:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html
您可以尝试 pandas 连接方法,而不是使用 pandas DataFrame.append
方法。
import pandas as pd
dfs = []
for i in lis:
dfs.append(client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10'))
data = pd.concat(dfs, axis=1) # set axis = 1 to concate by columns, not rows!
请注意,这假设您的 dfs 列表具有 a) 一个公共索引和 b) 除了 AAPL
和 MSFT
.
之外没有额外的列
如果需要,您也可以尝试合并:
from functools import reduce
data = reduce(lambda df1,df2: pd.merge(df1,df2,on='id'), dfs)
其中 id
是您从客户端提取的所有 dfs 共有的列。你可能不需要这个,因为你有匹配的索引并且想要连接列。
假设您无法更改生成初始输入的方法,您可以使用 groupby
:
修复它
data = data.groupby(level=0).max()
我正在尝试从 Tiingo 获取股票价格并附加数据帧
data = pd.DataFrame()
lis=[
"AAPL",
"MSFT",
"AMZN",
"GOOGL",
"TSLA",
"GOOG",
"NVDA",
"FB",
"JPM",
"BAC",
"ADBE",
"MA",
"PFE",
"DIS",
"NFLX",
"INTC",
"VZ",
"MO"
]
for i in lis:
data =data.append(client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10'))
然而,结果显示有点不同:
AAPL MFST
2020-03-01 100 NAN
2020-03-02 101 NAN
2020-03-03 103 NAN
... NAN
2021-12-10 120 NAN
2020-03-01 NAN 600
2020-03-02 NAN 400
2020-03-03 NAN 300
... NAN
2021-12-10 NAN 1100
我怎样才能让它看起来像这样:
AAPL MFST
2020-03-01 100 600
2020-03-02 101 400
2020-03-03 103 300
...
2021-12-10 120 1100
append 方法追加新行。这正是您所看到的结果。您需要加入而不是追加。
试试这个:
new_data = client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10')
data.join(new_data)
df.join() 方法的文档可在此处获得:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html
您可以尝试 pandas 连接方法,而不是使用 pandas DataFrame.append
方法。
import pandas as pd
dfs = []
for i in lis:
dfs.append(client.get_dataframe([i],
frequency='weekly',
metric_name='close',
startDate='2020-03-01',
endDate='2021-12-10'))
data = pd.concat(dfs, axis=1) # set axis = 1 to concate by columns, not rows!
请注意,这假设您的 dfs 列表具有 a) 一个公共索引和 b) 除了 AAPL
和 MSFT
.
如果需要,您也可以尝试合并:
from functools import reduce
data = reduce(lambda df1,df2: pd.merge(df1,df2,on='id'), dfs)
其中 id
是您从客户端提取的所有 dfs 共有的列。你可能不需要这个,因为你有匹配的索引并且想要连接列。
假设您无法更改生成初始输入的方法,您可以使用 groupby
:
data = data.groupby(level=0).max()