我有一个数据框,
x y z new_col
1 2 3 1
1 2 3 4
1 2 3 7
1 2 3 10
1 2 3 13
要创建一个新列并将第一行的值设置为1。 新列的所有其他值将是1 + 3(z中的3),然后是4 + 3,依此类推。
答案 0 :(得分:4)
您可以执行移位的累加总和:
df['new'] = 1 + df['z'].shift().fillna(0).astype(int).cumsum()
print(df)
x y z new
0 1 2 3 1
1 1 2 3 4
2 1 2 3 7
3 1 2 3 10
4 1 2 3 13
答案 1 :(得分:1)
您可以这样做:
df.assign(new_col = lambda x: 1 + x['z'].shift().cumsum()).fillna(1).astype(int)
x y z new_col
0 1 2 3 1
1 1 2 3 4
2 1 2 3 7
3 1 2 3 10
4 1 2 3 13
如果要对类型转换和na填充进行更具体的控制,还可以使用更详细的信息:
df.assign(new_col = lambda x: 1 + x['z'].shift().cumsum()
).fillna({'new_col':1}).astype({'new_col': int})
实际上,您可以使用与jpp的答案相同的逻辑,但可以将其包装在一个分配调用中:
df.assign(new_col = lambda x: 1+ x['z'].shift().fillna(0).astype(int).cumsum())
答案 2 :(得分:1)
您可以使用以下功能:pd.cumsum
如果您的DataFrame称为df:
df['new_column'] = df.cumsum() - df.z[0] + 1
这里有-2,因此您的总和可根据您的要求从1开始
答案 3 :(得分:0)
有很多方法可以做到,但是这里有两个非常简单的方法:
df['new_col'] = (3*df.x).cumsum() - 2
df['new_col'] = 3*df.index + 1
前者假设您的“ x”列仅包含值1(如果没有,则可以轻松创建类似df['temp'] = 1
的列)。
后者假定您的索引没有孔(例如,可能是由于掉落)。这两种方法易于实现且非常快(例如,比移位累加要快)。
此外,如果您需要执行的步骤取决于z
列中包含的值,则可以轻松地对其进行调整:
df['new_col'] = (df.z*df.x).cumsum() - 2
x y z new_col
0 1 2 3 1
1 1 2 3 4
2 1 2 3 7
3 1 2 3 10
4 1 2 3 13