Python创建新列并对其进行操作以及其他列

时间:2018-08-10 09:30:27

标签: python pandas dataframe

我有一个数据框,

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,依此类推。

4 个答案:

答案 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