繁体   English   中英

将两列相乘 pandas MultiIndex dataframe

[英]Multiply two columns in a pandas MultiIndex dataframe

我从未使用过 multiIndex pandas 数据帧,而 Python API 用于我使用的财务程序 CalcBench,当我键入以下代码时返回一个:

dataItems = ["ROE", "StockholdersEquity", "SharesOutstandingEndOfPeriod", "EndOfPeriodStockPrice"]             
data = cb.normalized_data(tickers, dataItems, start_year=2021, end_year=2021, period_type='annual')

如果我尝试通过键入data.info()来探索我的 dataframe,我得到:

<class 'pandas.core.frame.DataFrame'>
PeriodIndex: 1 entries, 2021 to 2021
Freq: A-DEC
Columns: 1800 entries, ('EndOfPeriodStockPrice', 'A') to ('StockholdersEquity', 'ZTS')
dtypes: float64(1800)

输入data.columns()给我:

MultiIndex([('EndOfPeriodStockPrice',    'A'),
            ('EndOfPeriodStockPrice',  'AAL'),
            ('EndOfPeriodStockPrice',  'AAP'),
            ('EndOfPeriodStockPrice', 'AAPL'),
            ('EndOfPeriodStockPrice', 'ABBV'),
            ('EndOfPeriodStockPrice',  'ABC'),
            ('EndOfPeriodStockPrice',  'ABT'),
            ('EndOfPeriodStockPrice',  'ACN'),
            ('EndOfPeriodStockPrice', 'ADBE'),
            ('EndOfPeriodStockPrice',  'ADI'),
            ...
            (   'StockholdersEquity', 'WYNN'),
            (   'StockholdersEquity',  'XEL'),
            (   'StockholdersEquity',  'XOM'),
            (   'StockholdersEquity', 'XRAY'),
            (   'StockholdersEquity',  'XYL'),
            (   'StockholdersEquity',  'YUM'),
            (   'StockholdersEquity',  'ZBH'),
            (   'StockholdersEquity', 'ZBRA'),
            (   'StockholdersEquity', 'ZION'),
            (   'StockholdersEquity',  'ZTS')],
           names=['metric', 'ticker'], length=1800)

我想通过将EndofPeriodStockPriceSharesOutstandingEndOfPeriod的相应条目相乘,在 dataframe 中为 2021 年的每家公司创建一个新指标MarketCapAtEndOfPeriod

我为此所做的努力没有任何结果,搜索 StackOverflow 也没有帮助我解决我的问题。 松散地说,我想写这样的东西:

data["MarketCapAtEndOfPeriod"] = data["EndofPeriodStockPrice"] * data["SharesOutstandingEndOfPeriod"]
market_cap = data.EndOfPeriodStockPrice * data.SharesOutstandingEndOfPeriod
market_cap_df = pd.concat(
    {"MarketCap": market_cap},
    names=["metric"],
    axis=1,
)

data = data.join(market_cap_df)

EndofPeriodStockPriceSharesOutstandingEndOfPeriod的相应条目相乘

使用DataFrame.xs通过指定 label 和可选的轴/水平来访问 MultiIndex 横截面。

  • 在您的情况下,目标标签位于第一级(默认),因此您可以省略level=0并为列指定axis=1
  • 要将 output 分配为新列,请在重新加入原始MultiIndex.from_product之前使用 MultiIndex.from_product 重建 MultiIndex。
key1 = 'EndofPeriodStockPrice'
key2 = 'SharesOutstandingEndOfPeriod'
new = 'MarketCapAtEndOfPeriod'

prod = data.xs(key1, axis=1) * data.xs(key2, axis=1)

prod.columns = pd.MultiIndex.from_product([[new], [key1, key2]])
# MultiIndex([('MarketCapAtEndOfPeriod', 'EndofPeriodStockPrice'),
#             ('MarketCapAtEndOfPeriod', 'SharesOutstandingEndOfPeriod')])

df = df.join(prod)

如果假设您想划分相应的AAPLABC条目,则它们位于第二列级别,因此同时指定axis=1level=1

data.xs('AAPL', axis=1, level=1) / data.xs('ABC', axis=1, level=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM