根据其他行/列和其他数据框填充nan

问题描述 投票:0回答:2

我有以下“covar”数据框(它是一个协方差矩阵),其中我有相同的项目作为索引和列名称。

covar_data = {
    'a': [0.04, np.nan, 0.03, np.nan, -0.04],
    'XY': [np.nan, np.nan, np.nan, np.nan, np.nan],
    'b': [0.03, np.nan, 0.09, np.nan, 0.00],
    'YZ': [np.nan, np.nan, np.nan, np.nan, np.nan],
    'c': [-0.04, np.nan, 0.00, np.nan, 0.16]
}
covar_index = ['a', 'XY', 'b', 'YZ', 'c']
covar = pd.DataFrame(covar_data, index=covar_index)

       a  XY     b  YZ     c
a   0.04 NaN  0.03 NaN -0.04
XY   NaN NaN   NaN NaN   NaN
b   0.03 NaN  0.09 NaN  0.00
YZ   NaN NaN   NaN NaN   NaN
c  -0.04 NaN  0.00 NaN  0.16

某些项目(本例中为“XY”和“YZ”,但实际数据集中有更多)是其他项目的克隆(“XY”是“a”的克隆,“YZ”是“b”的克隆)。 我需要:

  • 用克隆项目的列填充每个克隆列
  • 用克隆项目的行填充每个克隆行。

填充符号可以相同或相反。

缺失的对角线值应与相应克隆项目的对角线单元格相同,且符号始终相同。所以 ["XY":"XY"] = ["a":"a"] 和 ["YZ":"YZ"] = ["b":"b"]

我有另一个数据框(“df”),其中有克隆、它克隆的项目和符号(“1”表示相同的符号,“-1”表示相反的符号)。

clone_data = {
    'cloned_item': ['a', 'b'],
    'sign': [1, -1]
}
clone_index = ['XY', 'YZ']
df = pd.DataFrame(clone_data, index=clone_index)

      cloned_item  sign
clone                  
XY              a     1
YZ              b    -1

这是预期的输出:

       a    XY     b    YZ     c
a   0.04  0.04  0.03 -0.03 -0.04
XY  0.04  0.04  0.03 -0.03 -0.04
b   0.03  0.03  0.09 -0.09  0.00
YZ -0.03 -0.03 -0.09  0.09  0.00
c  -0.04 -0.04  0.00  0.00  0.16

如您所见,“XY”列/行与“a”列/行相同,具有相同的符号。 “YZ”列/行与“b”列/行相同,但符号相反。 “XY”和“YZ”的对角线值与“a”和“b”的对角线值相同。

有什么想法吗?谢谢

python pandas numpy
2个回答
0
投票

您需要识别并填充克隆行和列,然后更新对角线:

import pandas as pd
import numpy as np

covar_data = {
    'a': [0.04, np.nan, 0.03, np.nan, -0.04],
    'XY': [np.nan, np.nan, np.nan, np.nan, np.nan],
    'b': [0.03, np.nan, 0.09, np.nan, 0.00],
    'YZ': [np.nan, np.nan, np.nan, np.nan, np.nan],
    'c': [-0.04, np.nan, 0.00, np.nan, 0.16]
}
covar_index = ['a', 'XY', 'b', 'YZ', 'c']
covar = pd.DataFrame(covar_data, index=covar_index)

clone_data = {
    'cloned_item': ['a', 'b'],
    'sign': [1, -1]
}
clone_index = ['XY', 'YZ']
df = pd.DataFrame(clone_data, index=clone_index)

for clone, row in df.iterrows():
    cloned_item = row['cloned_item']
    sign = row['sign']
    covar[clone] = covar[cloned_item] * sign
    covar.loc[clone] = covar.loc[cloned_item] * sign
    covar.loc[clone, clone] = covar.loc[cloned_item, cloned_item] * np.sign(sign) 

print(covar)

这给出了

      a    XY     b    YZ     c
a   0.04  0.04  0.03 -0.03 -0.04
XY  0.04  0.04  0.03 -0.03 -0.04
b   0.03  0.03  0.09 -0.09  0.00
YZ -0.03 -0.03 -0.09 -0.09 -0.00
c  -0.04 -0.04  0.00 -0.00  0.16

0
投票

您可以分两部分执行此操作:复制行(乘以符号),然后复制列(乘以符号)。这将返回您正在寻找的输出。

# set rows to be multiple of cloned rows
covar.loc[df.index] = (
    covar.loc[df.cloned_item]
    # multiply row-wise
    .mul(df.set_index("cloned_item")["sign"], axis=0)
    # rename index
    .set_axis(df.index, axis=0)
    )

# set columns to be multiple of cloned columns
covar.loc[:, df.index] = (
    covar.loc[:, df.cloned_item]
    # multiply column-wise
    .mul(df.set_index("cloned_item")["sign"], axis=1)
    # rename columns
    .set_axis(df.index, axis=1)
    )

作为替代方案,您

.set_axis(...)
,您可以使用
.values

© www.soinside.com 2019 - 2024. All rights reserved.