Генерация логического фрейма данных на основе содержимого в серии и фрейме данных - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть:

 df = pd.DataFrame(
        [
            [22, 33, 44],
            [55, 11, 22],
            [33, 55, 11],
        ],
        index=["abc", "def", "ghi"],
        columns=list("abc")
    ) # size(3,3)

и:

unique = pd.Series([11, 22, 33, 44, 55]) # size(1,5)

, затем я создаю новый df на основе unique и df, так что:

df_new = pd.DataFrame(index=unique, columns=df.columns) # size(5,3)

Из этого вновь созданного df я хотел бы создать новый логический df на основе unique и df, так что конечный результат:

 df_new = pd.DataFrame(
        [
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 0],
            [0, 0, 1],
            [1, 1, 0],
        ],
        index=unique,
        columns=df.columns
    ) 

Этот новый df либо true, либо false, в зависимости от того, присутствует ли значение в исходном кадре данных или нет. Например, первый столбец имеет три значения: [22, 55, 33]. В df с размерами (5,3) этот первый столбец будет выглядеть следующим образом: [0, 1, 1, 0, 1], т.е. [0, 22, 33, 0, 55]

Я пытался filter2 = unique.isin(df) но это не работает, также не обязательно. Я попытался применить фильтр, но возвращенные размеры были неправильными. Как я могу это сделать?

1 Ответ

2 голосов
/ 17 февраля 2020

Используйте DataFrame.stack с DataFrame.reset_index, DataFrame.pivot, затем проверьте, не пропустили ли значения DataFrame.notna приведение к целым числам для сопоставления True->1 и False->0 и последнего удаления имен индексов и столбцов с помощью DataFrame.rename_axis:

df_new = (df.stack()
            .reset_index(name='v')
            .pivot('v','level_1','level_0')
            .notna()
            .astype(int)
            .rename_axis(index=None, columns=None))
print (df_new)
    a  b  c
11  0  1  1
22  1  0  1
33  1  1  0
44  0  0  1
55  1  1  0

Вспомогательная серия не требуется, но при наличии дополнительные значения или необходимо изменить порядок с помощью помощника. Серии использования добавить DataFrame.reindex:

#added 66
unique = pd.Series([11, 22, 33, 44, 55,66])

df_new = (df.stack()
            .reset_index(name='v')
            .pivot('v','level_1','level_0')
            .reindex(unique)
            .notna()
            .astype(int)
            .rename_axis(index=None, columns=None))
print (df_new)
    a  b  c
11  0  1  1
22  1  0  1
33  1  1  0
44  0  0  1
55  1  1  0
66  0  0  0
...