Панды - проверьте, существует ли значение в нескольких столбцах для каждой строки - PullRequest
0 голосов
/ 24 июня 2019

У меня есть следующий кадр данных Pandas:

Index  Name  ID1  ID2  ID3
    1  A     Y    Y    Y
    2  B     Y    Y        
    3  B     Y              
    4  C               Y

Я хочу добавить новый столбец «Несколько», чтобы указать те строки, в которых есть значение Y в более чем одном из столбцов ID1, ID2 и ID3.

Index  Name  ID1  ID2  ID3 Multiple
    1  A     Y    Y    Y   Y
    2  B     Y    Y        Y
    3  B     Y             N
    4  C               Y   N

Я бы обычно использовал np.where или np.select например ::10000

df['multiple'] = np.where(<More than 1 of ID1, ID2 or ID3 have a Y in>), 'Y', 'N')

но я не могу понять, как написать условное выражение. Число столбцов идентификаторов может возрастать, поэтому я не могу охватить каждую комбинацию как отдельное условие (например, (ID1 = Y and ID3 = Y) or (ID2 = Y and ID3 = Y). Я думаю, что, возможно, мне нужно что-то, что подсчитывает значения Y для именованных столбцов?

За пределами Pandas, я бы подумал о работе со списком, добавив значения для каждого столбца, где Y, а затем посмотреть, если список имеет длину больше 1.

Но я не могу думать, как это сделать в рамках ограничений np.where, np.select или df.loc. Есть указатели?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

, используя numpy для суммирования по строке вхождения Y, сделаем это:

df['multi'] = ['Y' if x > 1 else 'N' for x in np.sum(df.values == 'Y', 1)]

выход:

      Name ID1   ID2   ID3 multi
Index                           
1        A   Y     Y     Y     Y
2        B   Y     Y  None     Y
3        B   Y  None  None     N
4        C   Y  None  None     N
0 голосов
/ 24 июня 2019

Я бы сделал это так:

Получить список столбцов, которые вы хотите проверить.

    cols = [x for x in testdf.columns if "id" in x]

Вы можете использовать метод filter в DataFrame, если вы хотите для этого, но я думаю, что явный выбор списка столбцов более понятен, и у вас есть полная гибкость, чтобы изменить свои условия позже.

После этого просто:

    testdf["multiple"] = (testdf[cols]=="Y").any(axis="columns")

Пояснение:

  • testdf[cols] возвращает DataFrame, состоящий только из столбцов, выбранных в первой строке.
  • testdf[cols]=="Y" возвращает DataFrame, заполненный True или False согласно условию "== Y".
  • (). Any (axis = "columns") просматривает столбцы этого DataFrame и для каждой строки возвращает True, если какой-либо из элементов в строке имеет значение True, и False в противном случае.

Если вы действительно хотите, вы можете изменить значения True на «Y», а значения False на «N».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...