pandas 色谱柱置换- For循环太慢

k4ymrczo  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(108)

我有一个数据集,其中有三列,Light_2、Light_3和Light_4。我希望对每一行都对这三列中的相应值执行检查:对于每一行,如果Light_4中的值大于Light_2中的值但小于Light_3中的值,则它是正确的,我可以转到下一行。但是,如果顺序不是这样,我必须通过在列之间替换值来进行值之间的置换,以便row["Light_2]<row["Light_4"]<row["Light_3"]。进行置换后,我必须检查顺序是否正确,否则我必须进行新的排列直到遵守顺序。
此代码可以工作:

for i, r in dataOK.iterrows():
    while not (r["Light_2"] < r["Light_4"] < r["Light_3"]):
        if r["Light_2"] > r["Light_4"]:
            r["Light_2"], r["Light_4"] = r["Light_4"], r["Light_2"]
        if r["Light_4"] > r["Light_3"]:
            r["Light_4"], r["Light_3"] = r["Light_3"], r["Light_4"]
        if r["Light_2"] > r["Light_3"]:
            r["Light_2"], r["Light_3"] = r["Light_3"], r["Light_2"]

但是for循环和while循环沿着生成了一个循环,这个循环实在是太慢了,而且可能对数据分析有害。2有没有办法重写这个循环,使它以更快、更优化的方式执行相同的过程?

kkbh8khc

kkbh8khc1#

您可以尝试:

dataOK = pd.DataFrame({
    'Light_2': [1, 2, 3],
    'Light_3': [4, 5, 6],
    'Light_4': [7, 8, 9],
})
result = dataOK.assign(**{
    'Light_3': dataOK.max(axis=1),
    'Light_2': dataOK.min(axis=1),
    'Light_4': dataOK.median(axis=1),
})

输出

Light_2  Light_3  Light_4
0        1        7      4.0
1        2        8      5.0
2        3        9      6.0

注意,这是有效的,因为你有三列,中位数总是在最小值和最大值之间的列。

相关问题