【问题标题】:Update values in pairwise pandas df更新成对熊猫df中的值
【发布时间】:2018-09-25 00:23:30
【问题描述】:

我有一个成对的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 第 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 方法来快速做到这一点吗?

谢谢!

【问题讨论】:

    标签: python pandas function apply


    【解决方案1】:

    您可以通过布尔值分配它

    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
    

    【讨论】:

    • @LiamMcIntyre df==0 这将返回 boolean ,然后我们可以将值分配给 True 值
    【解决方案2】:

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

    【讨论】:

    • 啊,这太优雅了。您也可以添加 numpy 等效项 pd.DataFrame(np.where(df == 0, df.T, df))
    • 我稍微调整了一下
    • 很好,忘了 numpy 可以测试整数的真实性(不像熊猫,它需要布尔掩码)。
    【解决方案3】:

    使用 df 的转置调用将 0 替换为 NaN 和 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
    

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 2021-09-02
      • 2015-10-11
      • 2014-10-18
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多