Как добавить серии словарей с неизвестным количеством ключей - PullRequest
0 голосов
/ 12 февраля 2019

Я создал следующий словарь test, состоящий из Series объектов:

test = {
    'A': pd.Series([True, False, True]),
    'B' : pd.Series([True,False,False])
}

Я хотел бы выполнить test['A'] & test['B'].Моя проблема в том, что я хочу выполнить побитовое добавление для любого возможного количества ключей в словаре.(Т. Е. Это может быть 'A' или 'A' and 'B' или 'A' and 'B' and 'C' и т. Д.).В любом случае значение для каждого ключа имеет одинаковую длину, и все Series являются логическими значениями.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Существует простое однострочное решение вашей проблемы (если вы хотите кумулятивную and операцию над столбцами, например A and B, A and B and C, A and B and C and D и т. Д.):

import pandas as pd

test = {
    "A": pd.Series([True, True, True]),
    "B": pd.Series([True, False, False]),
    "C": pd.Series([False, True, False]),
    "D": pd.Series([True, False, False]),
}

df = pd.DataFrame.from_dict(test)

# Here is da man    
print(df.cummin(axis="columns"))

Используя cummin, если любое значение равно False, все последующие после него будут False, а также наименьшее значение.

Исходный кадр данных:

      A      B      C      D
0  True   True  False   True
1  True  False   True  False
2  True  False  False  False

Накопительное значениеand:

      A      B      C      D
0  True   True  False  False
1  True  False  False  False
2  True  False  False  False

Первый столбец A, второй A and B, третий A and B and C, последний A and B and C and D.

0 голосов
/ 12 февраля 2019

Существует множество преимуществ работы с DataFrame вместо словаря из Series объектов.Преобразование из последнего в первое тривиально:

>>> df = pd.DataFrame(test)
>>> df
       A      B
0   True   True
1  False  False
2   True  False

Хотя конструктор DataFrame довольно умен в разборе входных данных, вы можете явно сказать, что инициализируете из словаря, используя from_dict classmethod:

>>> df = pd.DataFrame.from_dict(test)

Теперь вы можете применить &, используя метод all вдоль любой оси, которую вы хотите:

>>> df.all(axis=1) # going across
0     True
1    False
2    False
dtype: bool

То же самое касается | с использованием any:

>>> df.any(axis=1)
0     True
1    False
2     True
dtype: bool
...