最近,我正在从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']
非常复杂的算法,但我尝试矢量化方法。
如果我理解的话,在this question中可以使用累加和。最后一列
lag_C
被移动了C
。在但我的算法不能用于df的第一行,因为只有这些行是从第
A
列的第一个值开始计数的,有时是从B
列开始计算的。因此,我创建了列D,其中是可分辨行,如果条件是True
,则后者是复制到输出列C
。在我更改了输入数据并测试了第一个有问题的行。我尝试用列的第一行
B
测试前3行的所有三种可能性。在我的输入条件是:}仅为}。列
列
A
和{1
或{C
和lag_C
是只有NaN
的辅助列。在相关问题 更多 >
编程相关推荐