【问题标题】:Finding cumprod for dataframe?为数据框寻找 cumprod?
【发布时间】:2021-09-07 09:49:39
【问题描述】:

我有一个(三角形)数据框 i,e:DF1:

2016A   NaN NaN  2.5  6.5  NaN  NaN
2016B   NaN 5.32 6.3  NaN  NaN  NaN
2017A   NaN 9.4  5.6  NaN  NaN  NaN
2018B   4.5 NaN  5.6  NaN  NaN  NaN
2018C   NaN 6.5  4.3  NaN  NaN  NaN
2019A   5.3 NaN  NaN  NaN  NaN  NaN

我必须为这个数据框找到 cumprod

我试过这段代码:

df2= df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]

但结果与 df​​1 相同

结果应该是这样的:

2016A   NaN NaN   16.25  6.5  NaN   NaN
2016B   NaN 33.51  6.3   NaN  NaN   NaN
2017A   NaN 52.64  5.6   NaN  NaN   NaN
2018B   25.2 NaN   5.6   NaN  NaN   NaN
2018C   NaN 27.95  4.3   NaN  NaN   NaN
2019A   5.3  NaN   NaN   NaN  NaN   NaN

感谢您的宝贵时间:)

【问题讨论】:

  • 你的代码运行良好,对你来说不行吗?
  • 出现错误?
  • 我没有数据框的列名或行名:
  • 错误类似于 :TypeError: can't multiply sequence by non-int of type 'float'
  • print (df.head(2).to_dict()) 是什么?

标签: python pandas dataframe numpy


【解决方案1】:

您的代码应该运行良好,但需要做一件事。就是不做第一列的计算:

>>> df.set_index(df.iloc[:, 0].name).iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1].reset_index()
       0     1       2      3    4   5   6
0  2016A   NaN     NaN  16.25  6.5 NaN NaN
1  2016B   NaN  33.516   6.30  NaN NaN NaN
2  2017A   NaN  52.640   5.60  NaN NaN NaN
3  2018B  25.2     NaN   5.60  NaN NaN NaN
4  2018C   NaN  27.950   4.30  NaN NaN NaN
5  2019A   5.3     NaN    NaN  NaN NaN NaN
>>> 

【讨论】:

  • 我认为是索引。
  • 它不工作,显示这个错误:TypeError: can't multiply sequence by non-int of type 'float'
  • @MichaelScofield df.dtypes 输出什么?
【解决方案2】:

编辑1:

首先使用header=None 避免将第一行数据转换为列名:

df1 = pd.read_excel(file, header=None)

有一个或多个非数字列,您可以通过以下方式找到它们:

print (df1.select_dtypes(exclude=np.number).columns)

如果所有列都应为数字,则排除 0, col1, col2 使用:

df1 = df1.set_index([0, 'col1','col2']).apply(pd.to_numeric, errors='coerce')

然后使用您的解决方案:

df2 = df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]

如果第一列不是索引:

lens = len(df1.columns)
df1.update(df1.iloc[:, lens:0:-1].cumprod(axis=1).iloc[:, lens:0:-1])
print (df1)
       0     1       2      3    4   5   6
0  2016A   NaN     NaN  16.25  6.5 NaN NaN
1  2016B   NaN  33.516   6.30  NaN NaN NaN
2  2017A   NaN  52.640   5.60  NaN NaN NaN
3  2018B  25.2     NaN   5.60  NaN NaN NaN
4  2018C   NaN  27.950   4.30  NaN NaN NaN
5  2019A   5.3     NaN    NaN  NaN NaN NaN

或者先按第一列创建index

df1 = df1.set_index(df1.columns[0])
df2 = df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多