Проверка состояния нескольких столбцов в пандах - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу создать новый столбец в моем фрейме данных, который помещает имя столбца в строке, если только этот столбец имеет значение 8 в соответствующей строке, в противном случае значение нового столбца для строки будет "NONE" , Для кадра данных df новый столбец df["New_Column"] = ["NONE","NONE","A","NONE"]

df = pd.DataFrame({"A": [1, 2,8,3], "B": [0, 2,4,8], "C": [0, 0,7,8]})

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы можете сделать это, используя idxmax и маску:

out = (df==8).idxmax(1)
m = ~(df==8).any(1) | ((df==8).sum(1) > 1)

df.assign(col=out.mask(m))

   A  B  C  col
0  1  0  0  NaN
1  2  2  0  NaN
2  8  4  7    A
3  3  8  8  NaN
0 голосов
/ 05 ноября 2018

Или сделать:

df2=df[(df==8)]
df['New_Column']=(df2[(df2!=df2.dropna(thresh=2).values[0]).all(1)].dropna(how='all')).idxmax(1)
df['New_Column'] = df['New_Column'].fillna('NONE')
print(df)

dropna + dropna снова + idxmax + fillna. это все, что вам нужно для этого.

Выход:

   A  B  C New_Column
0  1  0  0       NONE
1  2  2  0       NONE
2  8  4  7          A
3  3  8  8       NONE
0 голосов
/ 05 ноября 2018

Классная проблема.

  1. Найдите 8 полей в каждой строке: df==8
  2. Подсчитайте их: (df==8).sum(axis=1)
  3. Найдите строки, в которых количество равно 1: (df==8).sum(axis=1)==1
  4. Выберите только те строки из исходного кадра данных: df[(df==8).sum(axis=1)==1]==8
  5. Снова найдите 8 полей: df[(df==8).sum(axis=1)==1]==8)
  6. Найдите столбцы, которые содержат значения True с idxmax (потому что True>False): (df[(df==8).sum(axis=1)==1]==8).idxmax(axis=1)
  7. Заполнить пропуски с помощью "NONE"

Подведем итог:

df["New_Column"] = (df[(df==8).sum(axis=1)==1]==8).idxmax(axis=1)
df["New_Column"] = df["New_Column"].fillna("NONE")
#   A  B  C New_Column
#0  1  0  0       NONE
#1  2  2  0       NONE
#2  8  4  7          A
#3  3  8  8       NONE
# I added another line as a proof of concept
#4  0  8  0          B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...