收集其他熊猫df(具有相同索引)中列出的熊猫df中的细胞

时间:2018-09-02 19:35:05

标签: python pandas

考虑以下示例(感兴趣的两个元素是final_dfpivot_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_dfnumpy.nan(i,j)的条目bingo_df也应为numpy.nan
  • 否则,[{{1}的条目(i, j)不是final_df时,numpy.nan的条目(i,j)应该是单元格{{1 }} bingo_df(实际上[i, final_df[i, j].value]pivot_dffinal_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)

1 个答案:

答案 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