Лучший способ создать новый столбец на основе значений других столбцов - PullRequest
0 голосов
/ 14 сентября 2018

Какой лучший способ создать тот же столбец, упомянутый ниже:

col_new = []
for r1 in df['col_A']:
    if r1==1:
        for r2 in df['col_B']:
            if r2!='None':
                col_new.append('col_new')

df['col_new'] = col_new

Мой массив данных огромен (120k * 22), и выполнение вышеуказанного кода приводит к зависанию ноутбука.Существует ли более быстрый и эффективный способ создания этого столбца, в котором он представляет все ненулевые значения col_B, когда col_A равно 1.

1 Ответ

0 голосов
/ 14 сентября 2018

Я считаю, что нужно создать логическую маску, а затем добавить значение на DataFrame.loc:

mask = (df['col_A'] == 1) & (df['col_B']!='None')

#if None is not string
#mask = (df['col_A'] == 1) & (df['col_B'].notnull())
df.loc[mask, 'col_new'] = 'col_new'

Sample

В столбце есть строки None s:

df = pd.DataFrame({
    'col_A': [1,1,2,1],
    'col_B': ['a','None','None','a']
})
print (df)
   col_A col_B
0      1     a
1      1  None
2      2  None
3      1     a

mask = (df['col_A'] == 1) & (df['col_B']!='None')
df.loc[mask, 'col_new'] = 'val'
print (df)
   col_A col_B col_new
0      1     a     val
1      1  None     NaN
2      2  None     NaN
3      1     a     val

В столбце не строки None с , затем используйте Series.notna:

df = pd.DataFrame({
    'col_A': [1,1,2,1],
    'col_B': ['a',None,None,'a']
})
print (df)
   col_A col_B
0      1     a
1      1  None
2      2  None
3      1     a

mask = (df['col_A'] == 1) & (df['col_B'].notna())
#oldier pandas versions
#mask = (df['col_A'] == 1) & (df['col_B'].notnull())
df.loc[mask, 'col_new'] = 'val'
print (df)
   col_A col_B col_new
0      1     a     val
1      1  None     NaN
2      2  None     NaN
3      1     a     val

Также, если хотите, используйте if-else выражение numpy.where действительно полезно:

df['col_new'] = np.where(mask, 'val', 'another_val')
print (df)
   col_A col_B      col_new
0      1     a          val
1      1  None  another_val
2      2  None  another_val
3      1     a          val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...