Странное поведение Python

Как и все остальные, не совсем уверен, что вы пытаетесь сделать, я собираюсь предположить, что вы хотите установить значение либо текущего значения «A», либо «B», чтобы оно было равным наибольшему значений любого столбца в этой строке ... Если это предположение верно, вот как это можно сделать с помощью ".apply ()".

Во-первых, большинство «чистых» приложений (помня, что применение «.apply ()» обычно никогда не рекомендуется) из «.apply ()» используют функцию, которая принимает ввод строки, переданной ей Функция ".apply ()" и обычно возвращает тот же объект, но измененный / измененный / и т. д. по мере необходимости. Имея в виду ваш фрейм данных, это функция для достижения желаемого результата, за которой следует применение функции к фрейму данных с использованием «.apply ()».

# Create the function to be used within .apply()
def comparer(row):
    if row["a"] > row["b"]:
        row["b"] = row["a"]
    elif row["b"] > row["a"]:
        row["a"] = row["b"]
    return(row)

# Use .apply() to execute our function against our column values. Returning the result of .apply(), re-creating the "df" object as our new modified dataframe.
df = df.apply(comparer, axis=1)

Большинство, если не все, похоже, выступают против использования «.apply ()». Я, вероятно, прислушаюсь к их мудрости :)

7
задан Georg Schölly 12 May 2009 в 15:51
поделиться

5 ответов

Python is going right to left on the mathematical power operation. For example, IN[2] is doing:

2**(4) = 16

IN[3] = 2222 = 22**(4) = 2**16 = 65536

You would need parenthesis if you want it to calculate from left to right. The reason OUT[4] is not outputting the answer you want is because the number is astronomical and Python cannot print it out.

2^65536 = extremely huge

16
ответ дан 6 December 2019 в 05:39
поделиться

This is because the order of precedence in Python causes this equation to be evaluated from right-to-left.

>>> 2**2
4
>>> 2**2**2
16
>>> 2**(2**2)
16
>>> 2**2**2**2
65536
>>> 2**2**(2**2)
65536
>>> 2**(2**(2**2))
65536
>>> 2**2**2**2**2
57896044618658097711785492504343953926634992332820282019728792003956564819968L
>>> 2**2**2**(2**2)
57896044618658097711785492504343953926634992332820282019728792003956564819968L
>>> 2**2**(2**(2**2))
57896044618658097711785492504343953926634992332820282019728792003956564819968L
>>> 2**(2**(2**(2**2)))
57896044618658097711785492504343953926634992332820282019728792003956564819968L
>>> 2**255
57896044618658097711785492504343953926634992332820282019728792003956564819968L
4
ответ дан 6 December 2019 в 05:39
поделиться

The precedence of the ** operator makes the evaluation goes from right-to-left (instead of the expected left-to-right). In other words:

2**2**2**2 == (2**(2**(2**2)))
7
ответ дан 6 December 2019 в 05:39
поделиться

Как уже говорилось в других ответах, это потому, что ** оценивается справа налево. Вот ссылка на документацию , где описаны все приоритеты.

4
ответ дан 6 December 2019 в 05:39
поделиться

Evaluating right-to-left, let's look at the steps Python is going through to get these answers:

2**2
4

2**(2**2)
2**(4)
16

2**(2**(2**2))
2**(2**(4))
2**(16)
65536

2**(2**(2**(2**2)))
2**(2**(2**(4)))
2**(2**(16))
2**(65536)
2.0035299304068464649790723515603e+19728
3
ответ дан 6 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: