8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

将 DataFrame 中每列的最大值标记为 True,其余标记为 False

mongoose36 1月前

10 0

我有一个正在四舍五入的 DataFrame。四舍五入后,我从结果中减去原始数据。这给了我一个形状与原始数据相同的数据框,但其中包含

我有一个要四舍五入的 DataFrame。四舍五入后,我从结果中减去原始值。这给了我一个形状与原始形状相同的数据框,但其中包含四舍五入操作引起的变化量。

我需要将其转换为布尔值,其中行的最大值有一个 true 标志,而行中的其他所有内容都是 false。除最后一步外,所有步骤都由矢量化函数处理。但我似乎无法弄清楚如何矢量化最后一步。这是我目前正在做的事情:

a = pd.DataFrame([[2.290119, 5.300725, 17.266693, 75.134857, 0.000000, 0.000000, 0.007606],
[0.000000, 7.560276, 55.579175, 36.858266, 0.000000, 0.000000, 0.002284],
[0.001574, 15.225538, 39.309742, 45.373800, 0.000951, 0.001198, 0.087197],
[0.000000, 55.085390, 15.547927, 29.327661, 0.000000, 0.017691, 0.021331],
[0.000000, 66.283488, 15.636673, 17.912315, 0.000000, 0.003185, 0.164339]])

b = a.round(-1)  # round to 10's place (not 10ths)
c = b-a
round_modifier = c.apply(lambda x: x.eq(x.max()), axis="columns")
print(round_modifier)
       0      1      2      3      4      5      6
0  False  False  False   True  False  False  False
1  False  False   True  False  False  False  False
2  False   True  False  False  False  False  False
3  False   True  False  False  False  False  False
4  False  False   True  False  False  False  False

我知道 DataFrame.idxmax(axis="columns") ,它给出了找到最大值的列名(每行),但我似乎找不到一种(pythonic)方法来获取它并用 True 填充相应的标志。我使用的 lambda 表达式给出了正确的结果,但我希望有一种更快的方法。

如果有人想知道,用例是我想将原始数据框中的值四舍五入到十位,使得它们的总和为 100。我已经预先缩放了这些数据,所以它应该接近,但四舍五入可能会导致总和达到 90 或 110。我打算使用这个 T/F 矩阵来决定哪个舍入值导致最大的增量,然后将其向相反方向舍入,因为这是强制系列以 10 为块正确地总和为 100 的最小影响方法。

帖子版权声明 1、本帖标题:将 DataFrame 中每列的最大值标记为 True,其余标记为 False
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由mongoose36在本站《dataframe》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果您正在寻找矢量化解决方案,最好的方法之一就是使用 numpy。完成四舍五入后,您可以将整个数组输入其中。这应该会导致计算速度更快。如果您有兴趣阅读有关 numpy max 函数的更多信息,请点击此处。https: https://numpy.org/doc/stable/reference/generated/numpy.max.html

    import pandas as pd
    import numpy as np
    
    a = pd.DataFrame([[2.290119, 5.300725, 17.266693, 75.134857, 0.000000, 0.000000, 0.007606],
                      [0.000000, 7.560276, 55.579175, 36.858266, 0.000000, 0.000000, 0.002284],
                      [0.001574, 15.225538, 39.309742, 45.373800, 0.000951, 0.001198, 0.087197],
                      [0.000000, 55.085390, 15.547927, 29.327661, 0.000000, 0.017691, 0.021331],
                      [0.000000, 66.283488, 15.636673, 17.912315, 0.000000, 0.003185, 0.164339]])
    
    b = a.round(-1)  # round to 10's place (not 10ths)
    c = b - a
    
    # Use numpy for max and comparison
    max_in_rows = np.max(c.values, axis=1)[:, np.newaxis]
    round_modifier = c.values == max_in_rows
    round_modifier_df = pd.DataFrame(round_modifier, columns=a.columns)
    print(round_modifier_df)
    
  • 使用 idxmax 与 np.eye 组合创建一个布尔掩码,其中每行中的最大值标记为 Trueimport pandas as pdimport numpy as np

    a = pd.DataFrame([[2.290119, 5.300725, 17.266693, 75.134857, 0.000000, 0.000000, 0.007606],
                      [0.000000, 7.560276, 55.579175, 36.858266, 0.000000, 0.000000, 0.002284],
                      [0.001574, 15.225538, 39.309742, 45.373800, 0.000951, 0.001198, 0.087197],
                      [0.000000, 55.085390, 15.547927, 29.327661, 0.000000, 0.017691, 0.021331],
                      [0.000000, 66.283488, 15.636673, 17.912315, 0.000000, 0.003185, 0.164339]])
    
    # Round the dataframe to the tens place
    b = a.round(-1)
    
    # Calculate the difference
    c = b - a
    
    # Get the index of the maximum value for each row
    max_indices = c.idxmax(axis="columns")
    
    # Create a Boolean mask where True corresponds to the maximum value in each row
    round_modifier = np.zeros_like(c, dtype=bool)
    
    # Use advanced indexing to set the True values
    round_modifier[np.arange(len(c)), max_indices] = True
    
    round_modifier_df = pd.DataFrame(round_modifier, columns=a.columns)
    print(round_modifier_df)
    

    输出

        0      1      2      3      4      5      6
    0  False  False  False   True  False  False  False
    1  False  False   True  False  False  False  False
    2  False   True  False  False  False  False  False
    3  False   True  False  False  False  False  False
    4  False  False   True  False  False  False  False
    
  • vzr 1月前 0 只看Ta
    引用 4

    您可以使用 idxmax 来获取具有最大值的列的位置,然后使用 numpy 广播将该位置与列进行匹配。

    m = c.columns.to_numpy() == c.idxmax(axis=1).to_numpy()[:, None]
    new_df = pd.DataFrame(np.where(m, True, False), columns=c.columns)
    

    最终结果:

        0     1     2     3     4     5     6
    False False False  True False False False
    False False  True False False False False
    False  True False False False False False
    False  True False False False False False
    False False  True False False False False
    
  • 只需使用 max and eq :

    c.eq(c.max(axis=1), axis=0)
    

    输出:

           0      1      2      3      4      5      6
    0  False  False  False   True  False  False  False
    1  False  False   True  False  False  False  False
    2  False   True  False  False  False  False  False
    3  False   True  False  False  False  False  False
    4  False  False   True  False  False  False  False
    
返回
作者最近主题: