Соберите клетки в пандах df, которые перечислены в других пандах df (с тем же индексом) - PullRequest
0 голосов
/ 02 сентября 2018

Рассмотрим следующий пример (два представляющих интерес элемента: final_df и pivot_df. Остальная часть кода предназначена только для построения этих двух df):

import numpy
import pandas

numpy.random.seed(0)
input_df = pandas.concat([pandas.Series(numpy.round_(numpy.random.random_sample(10,), 2)),
                          pandas.Series(numpy.random.randint(0, 2, 10))], axis = 1) 
input_df.columns = ['key', 'val']


pivot_df = input_df.pivot(columns = 'key', values = 'val')\
                   .fillna(method = 'pad')\
                   .cumsum()

index_df = pivot_df.notnull()\
                   .multiply(pivot_df.columns, axis = 1)\
                   .replace({0.0: numpy.nan})\
                   .values

final_df = numpy.delete(numpy.partition(index_df, 3, axis = 1),
                        numpy.s_[3:index_df.shape[1]], axis = 1)
final_df.sort(axis = 1)            
final_df = pandas.DataFrame(final_df)

final_df содержит столько строк, сколько pivot_df. Я хочу использовать эти два для создания третьего df: bingo_df.

bingo_df должен иметь те же размеры, что и final_df. Тогда ячейки bingo_df должны содержать:

  • Всякий раз, когда запись (row = i, col = j) из final_df равна numpy.nan, запись (i,j) из bingo_df также должна быть numpy.nan.
  • В противном случае, [когда запись (i, j) из final_df не numpy.nan], запись (i,j) из bingo_df должна быть значением в ячейке [i, final_df[i, j].value] из pivot_df (фактически final_df[i, j].value это либо имя столбца pivot_df, либо numpy.nan)

Ожидаемый выход:

, поэтому первый ряд final_df равен

0.55, nan, nan.

Итак, я ожидаю, что первый ряд bingo_df будет:

0.0, nan, nan

потому что значение в ячейке (row = 0, col = 0.55) из pivot_df равно 0 (и два последующих numpy.nan в первом ряду final_df также должны быть numpy.nan в bingo_df)

, поэтому второй ряд final_df равен

0.55, 0.72, nan

Итак, я ожидаю, что второй ряд bingo_df будет:

0.0, 1.0, nan

потому что значение в ячейке (row = 1, col = 0.55) из pivot_df равно 0.0 и значение в ячейке (row = 1, col = 0.72) из pivot_df равно 1.0

1 Ответ

0 голосов
/ 02 сентября 2018

IIUC lookup

s=final_df.stack()
pd.Series(pivot_df.lookup(s.index.get_level_values(0),s),index=s.index).unstack()
Out[87]: 
     0    1    2
0  0.0  NaN  NaN
1  0.0  1.0  NaN
2  0.0  1.0  2.0
3  0.0  0.0  2.0
4  0.0  0.0  0.0
5  0.0  0.0  0.0
6  0.0  1.0  0.0
7  0.0  2.0  0.0
8  0.0  3.0  0.0
9  0.0  0.0  4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...