Применить функцию к двум строкам данных - PullRequest
0 голосов
/ 10 мая 2018

Приведенный кадр данных для панд выглядит так:

df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})

col1    col2
0   1   4
1   2   5
2   3   6

Я хотел бы сделать что-то эквивалентное этому, используя функцию, но не передавая "по значению" или в качестве глобальной переменной весь фрейм данных (он может быть огромным, и тогда он выдаст мне ошибку памяти):

i = -1
for index, row in df.iterrows():
    if i < 0:
        i = index
        continue
    c1 = df.loc[i][0] + df.loc[index][0]
    c2 = df.loc[i][1] + df.loc[index][1]
    df.ix[index, 0] = c1
    df.ix[index, 1] = c2
    i = index

col1    col2
0   1   4
1   3   9
2   6   15

То есть, я хотел бы иметь функцию, которая выдаст мне предыдущий вывод:

def my_function(two_rows):
   row1 = two_rows[0]
   row2 = two_rows[1]
   c1 = row1[0] + row2[0]
   c2 = row1[1] + row2[1]
   row2[0] = c1
   row2[1] = c2
   return row2

df.apply(my_function, axis=1)
df

col1    col2
0   1   4
1   3   9
2   6   15

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 10 мая 2018

То, что вы продемонстрировали, это cumsum

df.cumsum()

   col1  col2
0     1     4
1     3     9
2     6    15
def f(df):
    n = len(df)
    r = range(1, n)
    for j in df.columns:
        for i in r:
            df[j].values[i] += df[j].values[i - 1]

    return df

f(df)

Чтобы определить функцию как цикл, который делает это на месте

Медленная ячейка за ячейкой

def f(df):
    n = len(df)
    r = range(1, n)
    for j in df.columns:
        for i in r:
            df[j].values[i] += df[j].values[i - 1]

    return df

f(df)

   col1  col2
0     1     4
1     3     9
2     6    15

Компромисс между памятью и эффективностью

def f(df):
    for j in df.columns:
        df[j].values[:] = df[j].values.cumsum()

    return df

f(df)

f(df)

   col1  col2
0     1     4
1     3     9
2     6    15

Обратите внимание, что вам не нужно возвращать df. Я выбрал для удобства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...