Рассмотрим следующий пример (два представляющих интерес элемента: 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