#python #pandas #numpy #pivot #mask
Вопрос:
У меня есть набор данных, который выглядит следующим образом
Когда я делаю разворот, то это должно выглядеть так
Но чего я действительно хочу, так это
Я могу сделать это с помощью петель и материалов своего рода вручную, что не очень красиво и интуитивно понятно… как будто я мог бы искать значения, которые не являются типом «Нет», а затем заменить их на True и ifnot False. Но это, опять же, не очень красиво, и это может занять некоторое время, если я выполню его на большом наборе данных (что будет иметь место).
Поэтому я хотел бы знать, могу ли я сделать это с помощью одной строки или пары строк более красивым и быстрым способом.
Спасибо!
Ответ №1:
От вашего DataFrame
:
import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO("""
ID,ISIN
AXAMIL,A
AXAMIL,B
AXAMIL,C
AXAEXL,D
UNPEVL,A
UNPEVL,E
UNPMSP,A
UNPMSP,B"""), sep=',')
df
Мы можем использовать a groupby
, затем unstack
результат и преобразовать его так boolean
, чтобы получить ожидаемый результат :
>>> df.groupby(['ID', 'ISIN']).size().unstack(fill_value=0).astype(bool).rename_axis(None, axis=1).reset_index()
ID A B C D E
0 AXAEXL False False False True False
1 AXAMIL True True True False False
2 UNPEVL True False False False True
3 UNPMSP True True False False False
Ответ №2:
Вы можете просто использовать этот isna()
метод, вот так:
new_df = ~df.isna()
Ответ №3:
pandas.DataFrame.pivot_table
это то, что вы ищете. assign
просто создает фиктивную переменную для агрегирования.
df = (
df.assign(**{"": 1})
.pivot_table(
index="ID",
columns="ISIN",
aggfunc="max",
fill_value=0,
).astype(bool)
)
Выходы:
ISIN A B C D E
ID
AXAEXL False False False True False
AXAMIL True True True False False
UNPEVL True False False False True
UNPMSP True True False False False