考虑以下示例(感兴趣的两个元素是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)
应该是单元格{{1 }} 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)
答案 0 :(得分:3)
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