为了账号安全,请及时绑定邮箱和手机立即绑定

从多索引数据框中提取数据子集并计算列的差异

从多索引数据框中提取数据子集并计算列的差异

回首忆惘然 2023-06-13 15:03:49
我有一个 pandas 数据框,其中第一行有多个条目,但第二行有重复的列。               A                    B                 CDate           open    r    close   open    r  close  open    r   close      2000-07-03     19.7    5    17.1    66.26   4  6.22   23.26.  1   9.92000-07-05     49.8    2    8.3     78.81   6  4.34   39.81   5   5.12000-07-15     89.5    3    4.1     43.45   7  2.45   29.3    8   1.22000-08-13     74.7    6    7.4     34.26   8  6.4    72.26   9   5.42000-08-25     39.84   1    8.4     95.43   3  4.3    69.81.  0   5.22000-08-28     61.8    4    4.2     43.81   1  2.2    129.81  6   1.32000-09-11     82.79   7    7.4     66.26   1  6.5    72.25   6   5.62000-09-16     64.8    8    8.7     73.45   5  4.7    69.45   4   5.42000-09-22     58.5    9    3.3     13.81   8  2.9    777.8   8   1.4我想提取 2000 年第 7 个月的数据,并找出 A 或 B 或 C 中哪个最低(开盘价 - 收盘价)?我的计划:s=data.stack(level=0)values = s[s.index.get_level_values(1)]['open', 'close'].reset_index()values['Date'] = pd.to_datetime(values['Date'])start_date = 2000-07-01end_date = 2000-08-01mask = (data['date'] > start_date) & (data['date'] <= end_date)df = data.loc[mask]df['Val_Diff'] = df['open'] - df['close']print(df['Val_Diff'].max()) 我得到错误KeyError: "None of [Index are in the [columns]"为什么 multiindex 是这段代码的问题?
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

我认为这是由于堆栈垂直变形时索引中未命名的列引起的。
工艺流程:

  1. 展平多索引的列名。

  2. 使用 wide_to_long 函数从水平转换为垂直

  3. 将日期序列转换为“日期时间”格式以进行条件提取。

import pandas as pd

import numpy as np

import io

import datetime


data = '''

Date open r close open r close open r close  

2000-07-03 19.7 5 17.1 66.26 4 6.22 23.26 1 9.9

2000-07-05 49.8 2 8.3 78.81 6 4.34 39.81 5 5.1

2000-07-15 89.5 3 4.1 43.45 7 2.45 29.3 8 1.2

2000-08-13 74.7 6 7.4 34.26 8 6.4 72.26 9 5.4

2000-08-25 39.84 1 8.4 95.43 3 4.3 69.81 0 5.2

2000-08-28 61.8 4 4.2 43.81 1 2.2 129.81 6 1.3

2000-09-11 82.79 7 7.4 66.26 1 6.5 72.25 6 5.6

2000-09-16 64.8 8 8.7 73.45 5 4.7 69.45 4 5.4

2000-09-22 58.5 9 3.3 13.81 8 2.9 777.8 8 1.4

'''


data = pd.read_csv(io.StringIO(data), sep='\s+')

idx = pd.MultiIndex.from_arrays([['','A','A','A','B','B','B','C','C','C'], ['Date','open','r','close','open','r','close','open','r','close']])

data.columns = idx

new_cols = [k[1]+'_'+k[0] for k in data.columns[1:]]

new_cols.insert(0, 'Date')

data.columns = new_cols

data = pd.wide_to_long(data,['open','r','close'], i='Date', j='item', sep='_', suffix='\\w+')

data.reset_index(inplace=True)

data['Date'] = pd.to_datetime(data['Date'])

start_date = datetime.datetime(2000,7,1)

end_date = datetime.datetime(2000,8,1)

mask = (data.Date > start_date) & (data.Date <= end_date)

data = data.loc[mask]

data

    Date    item    open    r   close

0   2000-07-03  A   19.70   5   17.10

1   2000-07-05  A   49.80   2   8.30

2   2000-07-15  A   89.50   3   4.10

9   2000-07-03  B   66.26   4   6.22

10  2000-07-05  B   78.81   6   4.34

11  2000-07-15  B   43.45   7   2.45

18  2000-07-03  C   23.26   1   9.90

19  2000-07-05  C   39.81   5   5.10

20  2000-07-15  C   29.30   8   1.20


data['Val_Diff'] = data['open'] - data['close']

print(data['Val_Diff'].max()) 

85.4


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信