如何在熊猫的前一行中添加数组?

时间:2018-07-30 16:53:31

标签: python pandas

如果我有一个数组[1, 2, 3, 4, 5]和一个熊猫数据框

df = pd.DataFrame([[1,1,1,1,1], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0]])

   0  1  2  3  4
0  1  1  1  1  1
1  0  0  0  0  0
2  0  0  0  0  0
3  0  0  0  0  0

如何遍历Pandas DataFrame,将数组添加到上一行?

预期结果将是:

   0  1   2   3   4
0  1  1   1   1   1
1  2  3   4   5   6
2  3  5   7   9  11
3  4  7  10  13  16

4 个答案:

答案 0 :(得分:2)

将数组n添加到第 n 行,您可以使用np.arange(len(df))[:,None] * a创建该数组,然后添加第一行:

df
#   0  1  2  3  4
#0  1  1  1  1  1
#1  0  0  0  0  0
#2  0  0  0  0  0
#3  0  0  0  0  0

a = np.array([1, 2, 3, 4, 5])

np.arange(len(df))[:,None] * a
#array([[ 0,  0,  0,  0,  0],
#       [ 1,  2,  3,  4,  5],
#       [ 2,  4,  6,  8, 10],
#       [ 3,  6,  9, 12, 15]])

df[:] = df.iloc[0].values + np.arange(len(df))[:,None] * a

df
#   0  1   2   3   4
#0  1  1   1   1   1
#1  2  3   4   5   6
#2  3  5   7   9  11
#3  4  7  10  13  16

答案 1 :(得分:1)

df = pd.DataFrame([
    [1,1,1],
    [0,0,0],
    [0,0,0],
])
s = pd.Series([1,2,3])

# add to every row except first, then cumulative sum
result = df.add(s, axis=1)
result.iloc[0] = df.iloc[0]
result.cumsum()

或者如果您想要单线:

pd.concat([df[:1], df[1:].add(s, axis=1)]).cumsum()

无论哪种方式,结果:

   0  1  2
0  1  1  1
1  2  3  4
2  3  5  7

答案 2 :(得分:1)

使用 cumsum 和分配:

df[1:] = (df+l).cumsum()[:-1].values

   0  1   2   3   4
0  1  1   1   1   1
1  2  3   4   5   6
2  3  5   7   9  11
3  4  7  10  13  16

或使用 concat

pd.concat((df[:1], (df+l).cumsum()[:-1]))

   0  1   2   3   4
0  1  1   1   1   1
0  2  3   4   5   6
1  3  5   7   9  11
2  4  7  10  13  16

答案 3 :(得分:0)

cumsum之后,您可以shift并添加回原来的df

a = [1,2,3,4,5]

updated = df.add(pd.Series(a), axis=1).cumsum().shift().fillna(0)
df.add(updated)