簡體   English   中英

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

[英]Collect cells in pandas df that are listed in another pandas df (with same index)

考慮下面的示例(感興趣的兩個元素是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的單元bingo_df應包含:

  • 每當final_df的條目(row = i, col = j)final_dfnumpy.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].valuepivot_dfnumpy.nan的列的名稱)

預期輸出:

所以final_df的第一行是

0.55, nan, nan

所以我期望bingo_df的第一行是:

0.0, nan, nan

因為在單元中的值(row = 0, col = 0.55)pivot_df0 (和隨后的兩個numpy.nan的第一行中final_df還應numpy.nanbingo_df

所以final_df的第二行是

0.55, 0.72, nan

所以我期望bingo_df的第二行是:

0.0, 1.0, nan

因為pivot_df單元格(row = 1, col = 0.55)pivot_df 0.0 ,而pivot_df單元格中(row = 1, col = 0.72)pivot_df 1.0

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM