首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列在.apply - Pandas之后消失(Python)

列在.apply - Pandas之后消失(Python)
EN

Stack Overflow用户
提问于 2022-11-29 09:21:26
回答 3查看 36关注 0票数 0

我对熊猫很陌生,我正在尝试将以下两个数据合并为1:

代码语言:javascript
复制
                     nopat
0 2021-12-31  3.580000e+09
1 2020-12-31  6.250000e+08
2 2019-12-31 -1.367000e+09
3 2018-12-31  2.028000e+09
代码语言:javascript
复制
              capital_employed
0 2021-12-31      5.924000e+10
1 2020-12-31      6.062400e+10
2 2019-12-31      5.203500e+10
3 2018-12-31      5.441200e+10

当我试图将一个函数应用到我的新数据帧时,所有的列都会消失。这是我的代码:

代码语言:javascript
复制
roce_by_year = pd.merge(nopat, capital_employed) \
        .rename(columns={"": "date"}) \
        .sort_values(by='date') \
        .apply(lambda row: compute_roce(row['nopat'], row['capital_employed']), axis=1) \
        .reset_index(name='roce')

结果如下:

代码语言:javascript
复制
   index      roce
0      3  3.727119
1      2 -2.627078
2      1  1.030945
3      0  6.043214

我希望取得以下结果:

代码语言:javascript
复制
   date       roce
0   2018  3.727119
1   2019 -2.627078
2   2020  1.030945
3   2021  6.043214

你有什么解释吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-29 09:43:24

如果您想要一个方法链接的解决方案,您可以使用这样的方法:

代码语言:javascript
复制
import pandas as pd


roce_by_year = (
    pd.merge(nopat, capital_employed)
    .rename(columns={"": "date"})
    .assign(
        date=lambda xdf: pd.to_datetime(
            xdf["date"], errors="coerce"
        ).dt.year
    )
    .assign(
        roce=lambda xdf: xdf.apply(
            lambda row: compute roce(
                row["nopat"], row["capital_employed"]
            ), axis=1
        )
    )
    .sort_values("date", ascending=True)
)[["date", "roce"]]
票数 1
EN

Stack Overflow用户

发布于 2022-11-29 09:48:26

代码语言:javascript
复制
df1['date'] = pd.to_datetime(df1['date'])
df1
###
        date       nopat
0 2021-12-31  3580000000
1 2020-12-31   625000000
2 2019-12-31 -1367000000
3 2018-12-31  2028000000
代码语言:javascript
复制
df2['date'] = pd.to_datetime(df2['date'])
df2
###
        date  capital_employed
0 2021-12-31       59240000000
1 2020-12-31       60624000000
2 2019-12-31       52035000000
3 2018-12-31       54412000000
代码语言:javascript
复制
df3 = pd.merge(df1, df2, how='outer', left_on='date', right_on='date')\
    .pipe(lambda x: x.assign(roe = x['nopat']/x['capital_employed']))\
    .sort_values(by='date', ascending=True)\
    .pipe(lambda x: x[['date', 'roe']])\
    .pipe(lambda x: x.assign(date = x['date'].dt.strftime('%Y'))).reset_index(drop=True)
df3
###
   date       roe
0  2018  0.037271
1  2019 -0.026271
2  2020  0.010309
3  2021  0.060432
票数 1
EN

Stack Overflow用户

发布于 2022-11-29 09:35:30

Apply只创建新列。您可以尝试在现有的dataframe上创建一个新列,如

代码语言:javascript
复制
nopat.rename(columns={"": "date"}, inplace=True)
nopat.sort_values(by='date', inplace=True)

nopat.set_index('date', inplace=True)
capital_employed.rename(columns={"": "date"}, inplace=True)
capital_employed.set_index('date', inplace=True)
capital_employed.sort_values(by='date', inplace=True)
df = nopat.join(capital_employed, on='date')
df['roce'] = df.apply(lambda row: compute_roce(row['nopat'], 
                      row['capital_employed']), axis=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74611681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档