我创建了一个数据框架,其中包含到达和离开日期的数据框架中的日期和每月的天数。此数据帧的长度可以是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]])