通过在其他 DataFrame 中搜索索引和列名来用值填充矩阵

Fill matrix with value by searching for index and column names in other DataFrame

我有一个“空”数据框,如下所示:

        6807    6809    5341
126293  nan     nan     nan
126294  nan     nan     nan     
126295  nan     nan     nan     

列名给出 name_id 而索引值给出 file_id。现在我想在名为 procontneutral 的单独 pandas 数据框中搜索 file_idname_id,它们看起来像这个:

    file_id name_id
0   126293  7244
1   126293  4978
2   126293  5112
3   126293  6864

如果我在 pro 数据框中找到 file_idname_id 我想用 1 填充上面的空数据框单元格,当在 cont then -1 when in neutral,那么输入矩阵的值应该是0。给我这样的结果,例如:

        6807    6809    5341
126293  1       -1     0
126294  0       -1     0        
126295  1       -1     1        

有人知道怎么做吗?

这是一种方法,使用在 proneutralcont [=16= 中找到的 file_idname_id 的交集] 作为索引来设置您想要的值 1、0 或 -1。我使用 Python set class 来执行交集。但是,它不能很好地索引到 DataFrame,因为它会导致 tuple.

编辑:2022 年 1 月 29 日 我错过了我之前解决方案中的一个重要步骤。需要使用 itertools 产品才能获得 df.indexdf.columns 组合的所有排列。请参阅下面的更新代码。

from itertools import product

pro_idx = set(product(df.index, df.columns)).intersection(zip(pro['file_id'], pro['name_id']))
neut_idx = set(product(df.index, df.columns)).intersection(zip(neutral['file_id'], neutral['name_id']))
cont_idx = set(product(df.index, df.columns)).intersection(zip(cont['file_id'], cont['name_id']))

if any(pro_idx):
    for f,n in pro_idx:
        df.loc[f,n] = 1
        
if any(neut_idx):
    for f,n in neut_idx:
        df.loc[f,n] = 0
        
if any(cont_idx):
    for f,n in cont_idx:
        df.loc[f,n] = -1

您可以堆叠 'empty' df(我们称它为 df)并合并 proconneu 的组合。然后你可以re-arrange把它变回二维形状

将投票放在一个数据框中:

votes = pd.concat([pro.assign(v=1), con.assign(v=-1), neu.assign(v=0)])
votes['name_id'] = votes['name_id'].astype(str) # you may or may not have to do this depending on what type your actual df is, as I have no way of knowing. It should match the type from columns in the empty df

votes 现在看起来像这样(我编的数字):

    file_id name_id v
0   126293  6807    1
1   126293  4978    1
2   126293  5112    1
3   126293  6864    1
0   126295  6809    -1
0   126294  5341    0

现在我们将它合并到 name_id 和 file_id 上的堆叠 df:

df1  = (df.unstack()
            .reset_index()
            .merge(votes, left_on = ['level_0','level_1'], 
                right_on = [ 'name_id','file_id'], how='left')[['level_0', 'level_1', 'v']]
)

df1 长得像


    level_0 level_1 v
0   6807    126293  1.0
1   6807    126294  NaN
2   6807    126295  NaN
3   6809    126293  NaN
4   6809    126294  NaN
5   6809    126295  -1.0
6   5341    126293  NaN
7   5341    126294  0.0
8   5341    126295  NaN

现在unstack回来

df1.set_index(['level_1','level_0']).unstack()

输出:


        v
level_0 5341    6807    6809
level_1         
126293  NaN     1.0     NaN
126294  0.0     NaN     NaN
126295  NaN     NaN    -1.0

如果您在赞成或反对中都没有投票,就会得到 NaN。那些最初不存在于 df 中的 file_id/name_id 的 dfs 中的投票被忽略