从行中最后一个非零值中减去一;多列



我创建了一个数据框架,其中包含到达和离开日期的数据框架中的日期和每月的天数。此数据帧的长度可以是n列。

2021-01 2021-02 2021-03
0   0       0       4
1   0       2       1
2   0       5       0
3   0       4       4
4   10      2       0

我想做的是:选择最后一个值为非零的列,然后减去1。

之后基本上是这样的:

2021-01 2021-02 2021-03
0   0       0       3
1   0       2       0
2   0       4       0
3   0       4       3
4   10      1       0

我试过使用numpy与:

df2 = df2[np.arange(df2.shape[0]),(df2!=0).cumsum(1).argmax(1)] - 1

但这似乎对熊猫不起作用。

获取零行,然后过滤并只保留索引最低的行

has_zero = df.eq(0, axis=0)
all_zero_rows = has_zero.dot(df.columns.str.split())
col_to_replace = all_zero_rows.explode().drop_duplicates(keep="last").sort_index()[0]
df.loc[df.index[-1], col_to_replace] = df.loc[df.index[-1], col_to_replace] -1
print(df)
2021-01 2021-02 2021-03
0   0       0       3
1   0       2       0
2   0       4       0
3   0       4       3
4   10      1       0

您的意思是始终选择最后一列还是至少有一个非零值的最后一列?

编辑:好吧,这里有一个可能的解决方案。我在numpy数组上这样做是因为在数据帧上进行计算可能会有问题。

import numpy as np
import pandas as pd
list = [[0,0,4],[0,2,1],[0,5,0],[0,4,4],[10, 2, 0]]
nplist = np.array(list)
lastcol = np.where(nplist[:,-1]==0, nplist[:,-1], nplist[:,-1] - 1)
nplist[:,-1] = lastcol
df = pd.Dataframe(nplist, index=['2021-01', '2021-02', '2021-03'])

nplist
array([[ 0,  0,  3],
[ 0,  2,  0],
[ 0,  5,  0],
[ 0,  4,  3],
[10,  2,  0]])

最新更新