我有以下“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”的对角线值相同。
有什么想法吗?谢谢
您需要识别并填充克隆行和列,然后更新对角线:
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
您可以分两部分执行此操作:复制行(乘以符号),然后复制列(乘以符号)。这将返回您正在寻找的输出。
# 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
。