我有一个正在四舍五入的 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 的最小影响方法。
将 DataFrame 中每列的最大值标记为 True,其余标记为 False
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!