У мене стовпчик у пандах Python DataFrame, який має булі значення True / False, але для подальших розрахунків мені потрібно представлення 1/0. Чи є швидкий панди / нумізний спосіб це зробити?
У мене стовпчик у пандах Python DataFrame, який має булі значення True / False, але для подальших розрахунків мені потрібно представлення 1/0. Чи є швидкий панди / нумізний спосіб це зробити?
Відповіді:
Короткий спосіб перетворення одного стовпця булевих значень у стовпчик цілих чисел 1 або 0:
df["somecolumn"] = df["somecolumn"].astype(int)
somecolumn
. Використовуючи astype(int)
то зазнає невдачі. Ще один підхід, який перетворює True
на 1,0 і False
0,0 (плаває) при збереженні NaN-значень, це зробити:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
та отримати той же результат?
Просто помножте свій Dataframe на 1 (int)
[1]: data = pd.DataFrame([[True, False, True], [False, False, True]])
[2]: print data
0 1 2
0 True False True
1 False False True
[3]: print data*1
0 1 2
0 1 0 1
1 0 0 1
True
знаходиться 1
в Python, а також False
є 0
* :
>>> True == 1
True
>>> False == 0
True
Ви повинні мати змогу виконувати будь-які потрібні вам операції, просто обробляючи їх як би числами, оскільки вони є числами:
>>> issubclass(bool, int)
True
>>> True * 5
5
Отже, щоб відповісти на ваше запитання, робота не потрібна - у вас вже є те, що ви шукаєте.
* Використання Note I це як англійське слово, а не ключовим слово Python is
- True
не буде такою ж об'єкт , як і будь-який випадковий 1
.
np.sin(True).dtype
для мене є float16.
df.my_column.mean()
чудово (як ви розумієте), але коли я намагаюся: df.groupby("some_other_column").agg({"my_column":"mean"})
я отримую DataError: No numeric types to aggregate
, тому, здається, вони НЕ завжди однакові. Просто FYI.
bool
просто збирати стовпці.
TypeError: numpy boolean subtract, the
-`оператор, застарілий, замість цього використовуйте функцію bitwise_xor, ^
оператор або логічний_xor.` Використання @ відповіді користувача виправляє це.
bool
стовпців, як для int
стовпців
Ви також можете це зробити безпосередньо на Frames
In [104]: df = DataFrame(dict(A = True, B = False),index=range(3))
In [105]: df
Out[105]:
A B
0 True False
1 True False
2 True False
In [106]: df.dtypes
Out[106]:
A bool
B bool
dtype: object
In [107]: df.astype(int)
Out[107]:
A B
0 1 0
1 1 0
2 1 0
In [108]: df.astype(int).dtypes
Out[108]:
A int64
B int64
dtype: object
Ви можете використовувати перетворення для свого кадру даних:
df = pd.DataFrame(my_data condition)
df = df*1
Використовувати Series.view
для перетворення булевих в цілі числа:
df["somecolumn"] = df["somecolumn"].view('i1')