Python 以成对方式更新值

Python 以成对方式更新值,python,pandas,function,apply,Python,Pandas,Function,Apply,我有一个成对的df: raw_data = {0: [5,4,6,8,9], 1: [4,8,1,2,5], 2: [42, 52, 36, 24, 73], 3: [0, 0, 0, 2, 1], 4: [2, 2, 0, 2, 0]} df = pd.DataFrame(raw_data, columns = [0,1,2,3,4]) 我想将任何0设置为其对的值,例如,第3行第0列有一个0,因此其对将位于第3列第0行,在

我有一个成对的df:

raw_data = {0: [5,4,6,8,9], 
        1: [4,8,1,2,5], 
        2: [42, 52, 36, 24, 73], 
        3: [0, 0, 0, 2, 1],
        4: [2, 2, 0, 2, 0]}
df = pd.DataFrame(raw_data, columns = [0,1,2,3,4])
我想将任何0设置为其对的值,例如,第3行第0列有一个0,因此其对将位于第3列第0行,在本例中为值8

我可以通过迭代来实现:

for i in df.index:
    for j in df.columns:
        if df.loc[i,j] == 0:
            df.loc[i,j] = df.loc[j,i]
但是它很慢。我可以应用函数或df方法来快速执行此操作吗


谢谢

使用
df
的转置将0s替换为NaNs和
pd.DataFrame.fillna

df[df != 0].fillna(df.T).astype(int)

   0  1   2   3   4
0  5  4  42   8   2
1  4  8  52   2   2
2  6  1  36  24  73
3  8  2  24   2   2
4  9  5  73   1   0

使用
where/mask
我们将第一个参数为
True的地方置为空,并在第二个参数中用替换项填充它

df.where(df.astype(bool), df.T)
或者


还有per的建议,Numpy的等价物

pd.DataFrame(np.where(df, df, df.T), df.index, df.columns)

    0   1   2   3   4
0   5   4   6   8   9
1   4   8   1   2   5
2  42  52  36  24  73
3   8   2  24   2   1
4   2   2  73   2   0

您可以通过布尔值指定它

df[df==0]=df.T
df
Out[364]: 
   0  1   2   3   4
0  5  4  42   8   2
1  4  8  52   2   2
2  6  1  36  24  73
3  8  2  24   2   2
4  9  5  73   1   0

啊,这太优雅了。你也可以添加numpy等价物
pd.DataFrame(np.where(df==0,df.T,df))
我稍微调整了一下,忘记了numpy可以测试int的真实性(不像熊猫需要一个布尔掩码)。@LiamMcIntyre df==0这将返回布尔值,然后我们可以将值赋给真值
pd.DataFrame(np.where(df, df, df.T), df.index, df.columns)

    0   1   2   3   4
0   5   4   6   8   9
1   4   8   1   2   5
2  42  52  36  24  73
3   8   2  24   2   1
4   2   2  73   2   0
df[df==0]=df.T
df
Out[364]: 
   0  1   2   3   4
0  5  4  42   8   2
1  4  8  52   2   2
2  6  1  36  24  73
3  8  2  24   2   2
4  9  5  73   1   0