Python: как найти подходящие записи данных и выполнить эффективные вычисления между двумя наборами данных - PullRequest
0 голосов
/ 19 декабря 2018

Скажем, например, что у меня есть два набора данных, которые хранятся в виде фреймов данных Pandas, например:

Data1:
   C1      C2
"Peter"  "kiwi"
"John"   "banana"
"Susan"  "peach"
"Joe"    "apple"

Data2:
   C3      C4
"apple"     4 
"banana"    7
"apple"     4

Я хотел бы сначала кэшировать индексы совпадающих записей данных между двумя фреймами данных Pandas.Эта часть не учитывается в моем анализе времени выполнения, и было бы неплохо вычислить заранее для более эффективных поисков хешей позже.

например, желаемый вывод

 {banana: [1]      (banana from Data1 matches with row 1 in Data2)
 apple: [0,2]}     (apple from Data1 matches with row 0 & 2 in Data2)

Затем для каждой строки в данных1Я хотел бы суммировать значения Data2 [C4] для всех найденных совпадений.Более конкретно к примеру, я хочу, чтобы результирующее вычисление было таким:

"Peter":  0 (no match for "kiwi")
"John":   7 (one match for "banana", it's just 7)
"Susan":  0 (no match for "peach")
"Joe":    8 (two matches for "apple", they're 4+4)

Есть ли хороший способ сделать это, используя кадр данных pandas, или numpy, эффективно?Ака использует промежуточные шаги от вычисления словаря, чтобы помочь увеличить скорость суммирования позже.

Примечание:

Первая задача может быть сделана чем-то вроде

Data1.reset_index().groupby('C3')['index'].apply(list).loc[Data0.C2.unique()]

Второе задание может быть выполнено чем-то вроде

Data0['W'] = Data0['C2'].map(Data1.set_index('C3', append=True)) \
                        .sum(level=1)['C4']).fillna(0)

Но не уверен, как воспользоваться преимуществами работы, использованной в первой части, чтобы помочь в вычислениях со второй частью.

1 Ответ

0 голосов
/ 19 декабря 2018

Я думаю, что хороший способ сделать это - применить groupby и sum к data2, а затем сопоставить полученную серию с data1:

data1['matches'] = data1.C2.map(data2.groupby('C3')['C4'].sum()).fillna(0)
>>> data1
      C1      C2  matches
0  Peter    kiwi      0.0
1   John  banana      7.0
2  Susan   peach      0.0
3    Joe   apple      8.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...