python - Python Django:合并数据框在重叠列上执行求和
问题描述
我想合并两个具有完全相同列名的 DataFrame。重叠的列可以添加在一起。我遇到了一些麻烦,因为分组应该发生在名为“日期”的“索引”上,但我不能通过使用“日期”名称来创建这个索引。
实际上,我只需要索引(日期)和所有股票的总和它们的 'Adj Close'。
我试过了:
data.join(temp, how='outer')
返回: “ValueError:列重叠但未指定后缀:Index(['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')"
data = pd.concat([data, temp]).groupby([data.index, temp.index], as_index=True).sum(axis=1)
返回: “Grouper 和轴的长度必须相同
data = pd.merge(data, temp, left_index=True, right_index=True)['Adj Close'].sum(axis=1, skipna=True).astype(np.int64)
返回: “KeyError:'Adj Close'”
代码
def overview(request):
stocks = Stock.objects.all()
data = None
for stock in stocks:
if data is None:
data = yf.download(stock.ticker, start=stock.trade_date, period="ytd")
else:
temp = yf.download(stock.ticker, start=stock.trade_date, period="ytd")
data.join(temp, how='outer')
数据帧输出 1
[*********************100%***********************] 1 of 1 completed
Open High ... Adj Close Volume
Date ...
2019-09-19 55.502499 55.939999 ... 54.697304 88242400
2019-09-20 55.345001 55.639999 ... 53.897728 221652400
2019-09-23 54.737499 54.959999 ... 54.142803 76662000
2019-09-24 55.257500 55.622501 ... 53.885353 124763200
2019-09-25 54.637501 55.375000 ... 54.714626 87613600
... ... ... ... ... ...
2020-09-10 120.360001 120.500000 ... 113.489998 182274400
2020-09-11 114.570000 115.230003 ... 112.000000 180860300
2020-09-14 114.720001 115.930000 ... 115.360001 140150100
2020-09-15 118.330002 118.830002 ... 115.540001 184642000
2020-09-16 115.230003 116.000000 ... 112.129997 154679000
[251 rows x 6 columns]
数据框输出 2
[*********************100%***********************] 1 of 1 completed
Open High ... Adj Close Volume
Date ...
2020-09-03 1699.520020 1700.000000 ... 1629.510010 3186300
2020-09-04 1609.000000 1634.989990 ... 1581.209961 2792500
2020-09-08 1525.000000 1555.550049 ... 1523.599976 2701600
2020-09-09 1548.900024 1558.719971 ... 1547.229980 1962100
2020-09-10 1550.180054 1573.660034 ... 1526.050049 1651200
2020-09-11 1528.150024 1538.699951 ... 1515.760010 1535300
2020-09-14 1531.650024 1557.000000 ... 1508.829956 2133000
2020-09-15 1527.890015 1550.989990 ... 1535.119995 1152100
2020-09-16 1542.479980 1554.369995 ... 1512.089966 1106400
解决方案
假设你有 2 个这样的 df:
df1 = pd.DataFrame({'Adj Close':[1, 2]}, index=['2019-09-19','2019-09-20'])
df2 = pd.DataFrame({'Adj Close':[3, 4, 5]}, index=['2019-09-19','2019-09-20','2019-09-21'])
df1
Adj Close
2019-09-19 1
2019-09-20 2
df2
Adj Close
2019-09-19 3
2019-09-20 4
2019-09-21 5
然后你可以连接成一个df:
df = pd.concat([df1, df2])
Adj Close
2019-09-19 1
2019-09-20 2
2019-09-19 3
2019-09-20 4
2019-09-21 5
并用 sum 进行 groupby:
result = df.groupby(df.index).sum()
Adj Close
2019-09-19 4
2019-09-20 6
2019-09-21 5
推荐阅读
- python - 如何使用 lru_cache 缓存不同类实例中使用的 utils 函数?
- android - 如何在实体中按值选择房间列表?
- android - Android 操作系统上的启动器
- reactive-programming - 如何为反应式网络库实现背压?
- twitter-bootstrap - Bootstrap CSS 打破了工具提示弹出框
- php - 如何使用批处理文件运行 php 脚本?
- azure-anomaly-detection - 异常检测器会提供有状态版本吗?
- ocaml - 为什么此代码不起作用递归函数出错
- php - 如何在电子邮件中显示从 Laravel 发送的图像
- python-3.x - 简化我的代码,要创建的一个函数被其他函数使用