我有一个(三角形)数据框架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我必须为这个数据找到+ find 。
我试过这个代码:
df2= df1.iloc[:, ::-1].cumprod(axis=1).iloc[:, ::-1]但结果与df1相同
结果应该是:
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谢谢你抽出时间:)
发布于 2021-09-07 09:53:24
您的代码应该运行良好,但有一件事是必需的。不对第一栏进行计算:
>>> 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
>>> 发布于 2021-09-07 09:57:48
EDIT1:
首先,使用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]https://stackoverflow.com/questions/69085977
复制相似问题