【问题标题】:How do I shift one of the levels of pandas multi-index dataframe如何移动熊猫多索引数据框的级别之一
【发布时间】:2020-11-29 20:32:51
【问题描述】:

我有一个如下所示的数据框,其中包含几个“Industry”。我想将每个“行业”的“TradingDay”移动-1(即将 (Agriculture, 2013-02-01) 的所有结果分配给 (Agriculture, 2013-01-31) )。我该怎么做?

编辑:尝试在此处粘贴我的数据框,但粘贴后格式似乎有点混乱。

SecuCode    turnover_factor_score   money_amount
Industry    TradingDay              
Agriculture 2013-01-31  643592  000972.SZ   -1.141835   1000000.0
2725261 600127.SH   -1.141835   1000000.0
1130106 002311.SZ   -1.049047   1000000.0
573860  000910.SZ   -0.920112   1000000.0
554907  000893.SZ   -0.839209   1000000.0
2897424 600265.SH   -0.833196   1000000.0
3014061 600359.SH   -0.815974   1000000.0
2818571 600201.SH   -0.778457   1000000.0
3719096 600978.SH   -0.777874   1000000.0
1112611 002299.SZ   -0.776096   1000000.0
2013-02-01  643593  000972.SZ   -1.128565   1000000.0
2725262 600127.SH   -1.128565   1000000.0
1130107 002311.SZ   -1.039443   1000000.0
573861  000910.SZ   -0.915167   1000000.0
554908  000893.SZ   -0.837899   1000000.0
2897425 600265.SH   -0.828478   1000000.0
3014062 600359.SH   -0.805318   1000000.0
1112612 002299.SZ   -0.765372   1000000.0
2790871 600180.SH   -0.757498   1000000.0
3719097 600978.SH   -0.741660   1000000.0

【问题讨论】:

标签: python pandas multi-index


【解决方案1】:
  1. 生成的与您的结构匹配的数据集/数据框
  2. reset_index() 获取 TradingDay 作为列
  3. +1 考虑到我没想到你想要周末约会
  4. set_index() 再次构造为多索引
import datetime as dt
s = ['000972.SZ', '600127.SH', '002311.SZ', '000910.SZ', '000893.SZ',
       '600265.SH', '600359.SH', '002299.SZ', '600180.SH', '600978.SH']
id = ['643593', '2725262', '1130107', '573861', '554908', '2897425',
       '3014062', '1112612', '2790871', '3719097']
df = pd.DataFrame([{"Industry":"Agriculture", 
                    "TradingDay":r.floor("D"), 
                    "id":id[i%10], 
                    "SecuCode":s[i%10],
                    "turnover_factor_score":random.uniform(-1.5, 1), 
                    "money_amount":100000} 
 for i, r in enumerate(pd.date_range(dt.datetime(2020,5,1), 
                          dt.datetime(2020,5,4,23,59), freq="2.4H")) 
                   if r.weekday()<5]).set_index(["Industry", "TradingDay", "id"])

print(f"BEFORE\n{df.to_string()}")

# make index columns,  then add a day.  
# *day* is used to ensure  don't land on a weekend
df = df.reset_index().assign(
    day=lambda dfa: dfa["TradingDay"].dt.weekday,
    TradingDay=lambda dfa: np.where(dfa["day"]==4, 
                                    dfa["TradingDay"] + pd.offsets.BDay(), 
                                    dfa["TradingDay"] + pd.Timedelta("1D")) ,
).drop("day",axis=1).set_index(["Industry", "TradingDay", "id"])

print(f"\nAFTER\n{df.to_string()}")


输出

BEFORE
                                 SecuCode  turnover_factor_score  money_amount
Industry    TradingDay id                                                     
Agriculture 2020-05-01 643593   000972.SZ              -0.329526        100000
                       2725262  600127.SH              -1.496289        100000
                       1130107  002311.SZ              -1.399186        100000
                       573861   000910.SZ               0.990120        100000
                       554908   000893.SZ               0.031071        100000
                       2897425  600265.SH               0.888231        100000
                       3014062  600359.SH              -1.388038        100000
                       1112612  002299.SZ               0.513843        100000
                       2790871  600180.SH              -0.163897        100000
                       3719097  600978.SH               0.007092        100000
            2020-05-04 643593   000972.SZ              -0.340063        100000
                       2725262  600127.SH              -1.222781        100000
                       1130107  002311.SZ               0.202246        100000
                       573861   000910.SZ               0.255742        100000
                       554908   000893.SZ              -0.512855        100000
                       2897425  600265.SH              -1.062996        100000
                       3014062  600359.SH               0.271449        100000
                       1112612  002299.SZ               0.064240        100000
                       2790871  600180.SH               0.651950        100000
                       3719097  600978.SH              -0.074825        100000

AFTER
                                 SecuCode  turnover_factor_score  money_amount
Industry    TradingDay id                                                     
Agriculture 2020-05-04 643593   000972.SZ              -0.329526        100000
                       2725262  600127.SH              -1.496289        100000
                       1130107  002311.SZ              -1.399186        100000
                       573861   000910.SZ               0.990120        100000
                       554908   000893.SZ               0.031071        100000
                       2897425  600265.SH               0.888231        100000
                       3014062  600359.SH              -1.388038        100000
                       1112612  002299.SZ               0.513843        100000
                       2790871  600180.SH              -0.163897        100000
                       3719097  600978.SH               0.007092        100000
            2020-05-05 643593   000972.SZ              -0.340063        100000
                       2725262  600127.SH              -1.222781        100000
                       1130107  002311.SZ               0.202246        100000
                       573861   000910.SZ               0.255742        100000
                       554908   000893.SZ              -0.512855        100000
                       2897425  600265.SH              -1.062996        100000
                       3014062  600359.SH               0.271449        100000
                       1112612  002299.SZ               0.064240        100000
                       2790871  600180.SH               0.651950        100000
                       3719097  600978.SH              -0.074825        100000

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2017-09-21
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2019-10-28
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多