Как добавить массив к каждой предыдущей строке в пандах?

1

Если у меня есть массив [1, 2, 3, 4, 5] и Pandas Dataframe

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
  • 0
    Пожалуйста, отформатируйте это так, чтобы это было воспроизводимо.
Теги:
pandas

4 ответа

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

Использование 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
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
  • 1
    Обновлено для сброса первого ряда
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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню