Выбор столбцов с двумя уровнями (двоичные переменные) в кадре данных pandas - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь выбрать поля данных, которые имеют только два значения [0, 1]. Мой код работает для одного столбца, однако он терпит неудачу, когда я пытаюсь перебрать много столбцов.

Вот пример набора данных:

df = pd.DataFrame({'a':np.random.randint(0,2, size = (10)),
                    'b':np.random.randint(0,2, size = (10)),
                    'c':np.random.randint(0,6, size = (10)),
                   'd': ['x', 'y']*5
                  })
df

данные выглядят так:

df.to_dict()
{'a': {0: 1, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 1, 8: 0, 9: 1},
 'b': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 1, 7: 1, 8: 0, 9: 1},
 'c': {0: 1, 1: 1, 2: 2, 3: 2, 4: 5, 5: 2, 6: 2, 7: 0, 8: 4, 9: 3},
 'd': {0: 'x',
  1: 'y',
  2: 'x',
  3: 'y',
  4: 'x',
  5: 'y',
  6: 'x',
  7: 'y',
  8: 'x',
  9: 'y'}}

Должны быть выбраны столбцы «a» и «b». Строка ниже дает true, что я и хочу.

list(set(df[mylist[0]])) == [0,1]

Почему я получаю keyError, когда я запускаю это:

mylist = list(df.columns)

for i in mylist:
    if list(set(df[mylist.index(i)])) == [0,1]:
        print(i)

KeyError: 0

Я пытаюсь вывести список имен столбцов, чтоудовлетворять условию ЕСЛИ.

Ответы [ 2 ]

1 голос
/ 15 октября 2019
df = pd.DataFrame({'a':np.random.randint(0,2, size = (10)),
                    'b':np.random.randint(0,2, size = (10)),
                    'c':np.random.randint(0,6, size = (10)),
                   'd': ['x', 'y']*5
                  })
df

Использование DataFrame.isin + DataFrame.loc + DataFrame.all:

df.loc[:,df.isin([0,1]).all()]

или

df.loc[:,(df.eq(0)|df.eq(1)).all()]

Также вы можете использовать:

df[df.columns[df.isin([0,1]).all()]]

или:

df.T[df.isin([0,1]).all()].T

Выход:

   a  b
0  0  1
1  0  1
2  0  1
3  0  1
4  1  1
5  0  1
6  1  0
7  1  1
8  0  1
9  0  0

получить столбцы:

[*df.loc[:,df.isin([0,1]).all()].columns]
#['a', 'b']

для выбора по строкам просто сделайте:

df[df.isin([0,1]).all(axis=1)]

почему не работает ....

print(mylist)
#['a', 'b', 'c', 'd']
mylist.index('a')
#returns 0
df[0]
#key error 0 because 0 not in list of columnas a,b,c,d...
0 голосов
/ 15 октября 2019

вы можете сделать это с помощью транспонирования и суммирования, как показано ниже

df = pd.DataFrame({'a': {0: 1, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 1, 8: 0, 9: 1},
 'b': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 1, 7: 1, 8: 0, 9: 1},
 'c': {0: 1, 1: 1, 2: 2, 3: 2, 4: 5, 5: 2, 6: 2, 7: 0, 8: 4, 9: 3},
 'd': {0: 'x',
  1: 'y',
  2: 'x',
  3: 'y',
  4: 'x',
  5: 'y',
  6: 'x',
  7: 'y',
  8: 'x',
  9: 'y'}})


## Solution
df.T[df.sum()==(df==1).sum()].T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...