Длина значений не совпадает с использованием np.where или как записать значения на основе условия в новый столбец - PullRequest
1 голос
/ 16 октября 2019

Предположим, у меня есть df:

A | B |
aa| 11|   
aa| 12|    
aa| 13|   
ab| 11|   
ac| 11|
ab| 12|   
ad| 11|   
ae| 11|      

Я пытаюсь создать третий столбец и заполнить его в зависимости от следующих условий:
ЕСЛИ элемент в A имеет значение 12 ИЛИ 13 - write 'да, в столбце C. Else-write no.

Итак, я создал пустой столбец C и получил уникальные значения A. И использовал цикл for для заполнения столбца данных, но я постоянно получаю сообщение об ошибке.

df['C'] =''
uni = df['A'].unique()
for a in uni:
    vals=['12', '13']
    df['C'] = np.where(df[df['A']==a]['B'].isin(vals), 'YES', 'NO')  

Я также пытался использовать другой цикл for

for a in uni:
 if ('12' in df[df['A']==a]['B'].values) | ('13' in df[df['A']==a]['B'].values):
    df["C"]='YES'
else:
    df["C"]='NO'  

Но в этом случае весьстолбец заполнен только значениями NO.
Куда я повернул не так?

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Я думаю, вам нужно сначала проверить значения на Series.isin, а затем на DataFrame.groupby с DataFrame.any и GroupBy.transform проверить, если хотя бы один True на строки:

vals=[12, 13]
df['C'] = np.where(df['B'].isin(vals).groupby(df['A']).transform('any'), 'YES', 'NO')  
print (df)
    A   B    C
0  aa  11  YES
1  aa  12  YES
2  aa  13  YES
3  ab  11  YES
4  ac  11   NO
5  ab  12  YES
6  ad  11   NO
7  ae  11   NO

Или получить все значения A на условие, получить уникальные значения и передать другому isin:

df['C'] = np.where(df['A'].isin(df.loc[df['B'].isin(vals), 'A'].unique()), 'YES', 'NO')  
print (df)
    A   B    C
0  aa  11  YES
1  aa  12  YES
2  aa  13  YES
3  ab  11  YES
4  ac  11   NO
5  ab  12  YES
6  ad  11   NO
7  ae  11   NO
0 голосов
/ 16 октября 2019

Пожалуйста, посмотрите на stackoverflow и в Интернете в целом. Такого рода вопрос уже задавался много раз.

В любом случае, на код.

df["C"] = "NO"
df.loc[(df["B"] == 12) | (df["B"] == 13), "C"] = "YES"

Для чего этоСтоит, этот ответ примерно в два раза быстрее, чем ответ @ jezrael.

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