首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python :当df.columns = df.columns.droplevel()

Python :当df.columns = df.columns.droplevel()
EN

Stack Overflow用户
提问于 2019-01-24 01:46:11
回答 1查看 100关注 0票数 1

我有一份交易数据。我想从这辆OHLCV上得到。

当我对此进行聚合时,我会得到一个多索引的数据。当我通过赋值列从多个索引中删除级别时,浮点尾上会出现额外的字符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd

trades = pd.DataFrame(
    data={
        'price': np.random.uniform(1000, 1200, 48),
        'volume': np.random.uniform(50, 100, 48)
    },
    index=pd.date_range(start='2019-01-01 00:00', end='2019-01-02 23:00', freq='H')
)

ohlcv = trades.resample('D').agg({'price': 'ohlc', 'volume': 'sum'})
# ohlcv['volume'].iloc[0] == 1744.871219

ohlcv.columns = ohlcv.columns.droplevel()
# ohlcv['volume'].iloc[0] == 1744.8712193218892
  • 如何删除多个索引的级别,使浮点数不发生变化?或
  • 如何在不生成多个索引的情况下聚合初始数据?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-24 01:50:38

没有更改的值,只是没有显示,因为第一次iloc返回一个值Series

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(456)
trades = pd.DataFrame(
    data={
        'price': np.random.uniform(1000, 1200, 48),
        'volume': np.random.uniform(50, 100, 48)
    },
    index=pd.date_range(start='2019-01-01 00:00', end='2019-01-02 23:00', freq='H') )

ohlcv = trades.resample('D').agg({'price': 'ohlc', 'volume': 'sum'})
print (ohlcv)
                  price                                              volume
                   open         high          low        close       volume
2019-01-01  1049.751182  1177.140381  1001.636683  1001.636683  1777.630832
2019-01-02  1072.013700  1194.631131  1008.525926  1130.678109  1804.651706

print (ohlcv['volume'].iloc[0])
volume    1777.630832
Name: 2019-01-01 00:00:00, dtype: float64

print (ohlcv['volume'].iloc[0].tolist())
[1777.630832239808]

ohlcv.columns = ohlcv.columns.droplevel()
print (ohlcv['volume'].iloc[0])
1777.630832239808

另一种删除MultiIndex的解决方案是带joinmap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ohlcv.columns = ohlcv.columns.map('_'.join)
print (ohlcv)
             price_open   price_high    price_low  price_close  volume_volume
2019-01-01  1049.751182  1177.140381  1001.636683  1001.636683    1777.630832
2019-01-02  1072.013700  1194.631131  1008.525926  1130.678109    1804.651706

使用MultiIndex.droplevel的解决方案也是可以使用的,但是要小心避免返回重复的列名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ohlcv = trades.resample('D').agg({'price': 'ohlc', 'volume': 'ohlc'})
print (ohlcv)
                  price                                            volume  \
                   open         high          low        close       open   
2019-01-01  1049.751182  1177.140381  1001.636683  1001.636683  68.335978   
2019-01-02  1072.013700  1194.631131  1008.525926  1130.678109  85.631147   


                 high        low      close  
2019-01-01  98.772905  50.545352  70.416061  
2019-01-02  99.011524  51.194741  57.057429  

ohlcv.columns = ohlcv.columns.droplevel()
print (ohlcv)
                   open         high          low        close       open  \
2019-01-01  1049.751182  1177.140381  1001.636683  1001.636683  68.335978   
2019-01-02  1072.013700  1194.631131  1008.525926  1130.678109  85.631147   

                 high        low      close  
2019-01-01  98.772905  50.545352  70.416061  
2019-01-02  99.011524  51.194741  57.057429 

print (ohlcv['open'])
                   open       open
2019-01-01  1049.751182  68.335978
2019-01-02  1072.013700  85.631147
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54343618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文