成对更新值

2024-04-20 13:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一对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方法来快速完成吗?你知道吗

谢谢!你知道吗


Tags: columns方法函数indataframedffordata
3条回答

用nan和pd.DataFrame.fillna调用replace 0s,使用df的转置。你知道吗

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

你可以用布尔值来赋值

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

使用where/mask我们将第一个参数为True的地方置空,并用第二个参数中的替代项填充它。你知道吗

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

或者

df.mask(df.eq(0), df.T)

    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

根据@cᴏʟᴅsᴘᴇᴇᴅ的建议,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

相关问题 更多 >