pandas Dataframe Заменить значения NaN на предыдущие значения, основанные на ключевом столбце - PullRequest
0 голосов
/ 26 июня 2018

У меня есть pd.dataframe, который выглядит так:

key_value    a    b    c    d    e
value_01     1    10   x   NaN  NaN
value_01    NaN   12  NaN  NaN  NaN
value_01    NaN   7   NaN  NaN  NaN
value_02     7    4    y   NaN  NaN 
value_02    NaN   5   NaN  NaN  NaN
value_02    NaN   6   NaN  NaN  NaN
value_03     19   15   z   NaN  NaN

Так что теперь на основе key_value,

Для столбца 'a' & 'c' я хочу скопировать значение последней ячейки из того же столбца 'a' & 'c', основываясь на значении ключа.

Для другого столбца «d» я хочу скопировать значение строки «i - 1» из столбца «b» в столбец «d» i-й ячейки.

Наконец, для столбца 'e' я хочу скопировать сумму ячеек 'i - 1' из столбца 'b' в столбец 'e' i'я ячейка.

Для каждого ключевого_значения столбцы 'a', 'b' & 'c' имеют некоторое значение в первой строке, на основе которого копируются следующие значения в другие столбцы или для них. создается для.

key_value    a    b    c    d    e
value_01     1    10   x   NaN  NaN
value_01     1    12   x    10   10
value_01     1    7    x    12   22
value_02     7    4    y   NaN  NaN
value_02     7    5    y    4    4
value_02     7    6    y    5    9
value_03     8    15   z   NaN  NaN

Мой текущий подход:

size = df.key_value.size
for i in range(size):
    if pd.isna(df.a[i]) and df.key_value[i] == output.key_value[i - 1]:
        df.a[i] = df.a[i - 1]
        df.c[i] = df.c[i - 1]
        df.d[i] = df.b[i - 1]
        df.e[i] = df.e[i] + df.b[i - 1]

Для таких столбцов, как 'a' и 'b', значения NaN находятся в одинаковых индексах строк.

Мой подход работает, но занимает очень много времени, так как в моем фрейме данных содержится более 50000 записей, мне было интересно, есть ли другой способ сделать это, так как у меня есть несколько столбцов, таких как 'a' и 'b', куда нужно копировать значения на основе 'key_value' и некоторых столбцов, где значения вычисляются с использованием, скажем, столбца типа 'b'

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

pd.concat с groupby и assign

pd.concat([
    g.ffill().assign(d=lambda d: d.b.shift(), e=lambda d: d.d.cumsum())
    for _, g in df.groupby('key_value')
])

  key_value     a  b  c    d    e
0  value_01   1.0  1  x  NaN  NaN
1  value_01   1.0  2  x  1.0  1.0
2  value_01   1.0  3  x  2.0  3.0
3  value_02   7.0  4  y  NaN  NaN
4  value_02   7.0  5  y  4.0  4.0
5  value_02   7.0  6  y  5.0  9.0
6  value_03  19.0  7  z  NaN  NaN

groupby и apply

def h(g):
    return g.ffill().assign(
        d=lambda d: d.b.shift(), e=lambda d: d.d.cumsum())

df.groupby('key_value', as_index=False, group_keys=False).apply(h)
0 голосов
/ 26 июня 2018

Вы можете использовать groupby + ffill для группового заполнения. Другие операции требуют shift и cumsum.

В общем, обратите внимание, что многие обычные операции были эффективно реализованы в Pandas.

g = df.groupby('key_value')

df['a'] = g['a'].ffill()
df['c'] = g['c'].ffill()
df['d'] = df['b'].shift()
df['e'] = df['d'].cumsum()

print(df)

  key_value     a  b  c    d     e
0  value_01   1.0  1  x  NaN   NaN
1  value_01   1.0  2  x  1.0   1.0
2  value_01   1.0  3  x  2.0   3.0
3  value_02   7.0  4  y  3.0   6.0
4  value_02   7.0  5  y  4.0  10.0
5  value_02   7.0  6  y  5.0  15.0
6  value_03  19.0  7  z  6.0  21.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...