python中的retain函数

2024-04-24 19:42:03 发布

您现在位置:Python中文网/ 问答频道 /正文

最近,我正在从SAS转换成Python pandas。我有一个问题是pandas在SAS中是否有一个retain-like函数,这样我就可以动态地引用最后一条记录了。在下面的代码中,我必须手动遍历每一行并引用最后一条记录。与类似的SAS程序相比,它似乎相当慢。有没有什么方法能让熊猫更有效?谢谢您。在

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 1, 1, 1], 'B': [0, 0, 1, 0]})
df['C'] = np.nan
df['lag_C'] = np.nan
for row in df.index:
    if row == df.head(1).index:
        df.loc[row, 'C'] = (df.loc[row, 'A'] == 0) + 0
    else:
        if (df.loc[row, 'B'] == 1):
            df.loc[row, 'C'] = 1
        elif (df.loc[row, 'lag_C'] == 0):
            df.loc[row, 'C'] = 0
        elif (df.loc[row, 'lag_C'] != 0):
            df.loc[row, 'C'] = df.loc[row, 'lag_C'] + 1
    if row != df.tail(1).index:
        df.loc[row +1, 'lag_C'] = df.loc[row, 'C']

Tags: importpandasdfindexifasnp记录
1条回答
网友
1楼 · 发布于 2024-04-24 19:42:03

非常复杂的算法,但我尝试矢量化方法。
如果我理解的话,在this question中可以使用累加和。最后一列lag_C被移动了C。在

但我的算法不能用于df的第一行,因为只有这些行是从第A列的第一个值开始计数的,有时是从B列开始计算的。因此,我创建了列D,其中是可分辨行,如果条件是True,则后者是复制到输出列C。在

我更改了输入数据并测试了第一个有问题的行。我尝试用列的第一行B测试前3行的所有三种可能性。在

我的输入条件是:
A和{}仅为1或{}。列Clag_C是只有NaN的辅助列。在

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1,1,1,1,1,0,0,1,1,0,0], 'B': [0,0,1,1,0,0,0,1,0,1,0]})
df1 = pd.DataFrame({'A': [1,1,1,1,1,0,0,1,1,0,0], 'B': [0,0,1,1,0,0,0,1,0,1,0]})

#cumulative sum of column B
df1['C'] = df1['B'].cumsum()
df1['lag_C'] = 1
#first 'group' with min value is problematic, copy to column D for latter use
df1.loc[df1['C'] == df1['C'].min() ,'D'] = df1['B']
#cumulative sums of groups to column C
df1['C']= df1.groupby(['C'])['lag_C'].cumsum()
#correct problematic states in column C, use value from D
if (df1['A'].loc[0] == 1):
    df1.loc[df1['D'].notnull() ,'C'] = df1['D']
if ((df1['A'].loc[0] == 1) & (df1['B'].loc[0] == 1)):
    df1.loc[df1['D'].notnull() ,'C'] = 0
del df1['D']
#shifted column lag_C from column C
df1['lag_C'] = df1['C'].shift(1)
print df1
#    A  B  C  lag_C
#0   1  0  0    NaN
#1   1  0  0      0
#2   1  1  1      0
#3   1  1  1      1
#4   1  0  2      1
#5   0  0  3      2
#6   0  0  4      3
#7   1  1  1      4
#8   1  0  2      1
#9   0  1  1      2
#10  0  0  2      1

相关问题 更多 >