以成对pandas df更新值

时间:2018-04-15 00:16:00

标签: 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])

我想设置任意零到它的对的值,例如在col 0第3行是0,所以它的对将是col 3 row 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方法快速完成此操作吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

使用pd.DataFrame.fillna的转置,使用NaN和df调用替换0。

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

答案 1 :(得分:3)

使用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

答案 2 :(得分:3)

您可以通过布尔

指定它
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