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

Я пытаюсь создать накопительный фрейм данных из различных фрагментированных небольших фреймов данных.

Например, у меня есть фрагментированные небольшие фреймы данных A и B, такие как:

      a  c
100   1  2
200   5  6

      a  b  d
100   2  3  8
200   9  1  9

A = pd.DataFrame(data = [[1,2],[5,6]], index=[100,200], columns=['a','c'])

B = pd.DataFrame(data = [[2,3,8],[9,1,9]], index=[100,200], columns=['a','b','d'])

, и я хочу добавить их в кумулятивный фрейм данных c

      a  b  c  d
100   0  0  0  0
200   0  0  0  0

C = pd.DataFrame(data = [[0,0,0,0],[0,0,0,0]], index=[100,200], columns=['a','b','c','d'])

то, что я хочу сделать, это добавить A и B к C, чтобы сделать:

      a   b  c  d
100   3   3  2  8
200   14  1  6  9

то, что я сделал сначала, было что-то вроде:

C[A.columns] += A
C[B.columns] += B

, который прекрасно работает и приносит желаемоеoutput.

Однако в моем реальном приложении проблемы с эффективностью возрастают, поскольку размеры A, B и C довольно велики, и существует множество фрагментированных информационных фреймов, таких как A и B

.Поэтому я искал несколько альтернативных методов и нашел pandas.eval довольно мощным в матричных операциях большого размера.

Я попробовал:

import pandas as pd
C = pd.eval('C+A')
C = pd.eval('C+B')

Однако в этом случае столбцы, не включенные в A или B, становятся NaN ...

out: 
       a   b    c   d
100  1.0 NaN  2.0 NaN
200  5.0 NaN  6.0 NaN

out:
        a   b   c   d
100   3.0 NaN NaN NaN
200  14.0 NaN NaN NaN

Любые предложения посделать желаемую операцию более эффективно?Будем благодарны за любые предложения (мне не обязательно использовать pd.eval)

Заранее спасибо!

1 Ответ

0 голосов
/ 02 марта 2019

Иногда использовать pd.eval сложно.

Здесь вам нужно использовать столбцы, которые добавляются в C df, и нам нужно передать список столбцов с помощью переменной при использовании pd.eval.

a_cols = A.columns
b_cols = B.columns
C[a_cols] = pd.eval('C[a_cols]+A', engine='python')
C[b_cols] = pd.eval('C[b_cols]+B', engine='python')

out:
      a  b  c  d
100   3  3  2  8
200  14  1  6  9

А для двигателя нам нужно использовать 'python' вместо 'numexpr', что по умолчанию для двигателя.

...