Цикл Python для проверки строк в столбце равен нулю, а затем заменить - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь получить ненулевое значение для Фамилии, но получаю ошибку.Как я могу решить это?PS У меня 20 миллионов строк.

dataframe:

FirstName   Middle  LastName
Tom          Ju     NaN
Kity         NaN    Rob

моя попытка:

for row in df:
    if row['LastName'].isnull() == True:
        row['real_lastName'] =  row['Middle']
    else:
        row['real_lastName'] =  row['LastName'] 

У меня следующая ошибка

TypeError: string indices must be integers

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Другой вариант:

df["real_lastName"] = df['middle'].replace(np.NaN, '') + df['last_name'].replace(np.NaN, '')
0 голосов
/ 29 мая 2018

Использование numpy.where:

df['real_lastName'] = np.where(df['LastName'].isnull(), df['Middle'], df['LastName'] )

print (df)
  FirstName Middle LastName real_lastName
0       Tom     Ju      NaN            Ju
1      Kity    NaN      Rob           Rob

Другим возможным решением является использование fillna или combine_first:

df['real_lastName'] = df['LastName'].fillna(df['Middle'])

df['real_lastName'] = df['LastName'].combine_first(df['Middle'])

Производительность аналогична:

#[200000 rows x 4 columns]
df = pd.concat([df] * 100000, ignore_index=True)
In [41]: %timeit df['real_lastName'] = np.where(df['LastName'].isnull(), df['Middle'], df['LastName'] )
13.3 ms ± 51.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [42]: %timeit df['real_lastName'] = df['LastName'].fillna(df['Middle'])
16.2 ms ± 58.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [43]: %timeit df['real_lastName'] = df['LastName'].combine_first(df['Middle'])
13 ms ± 100 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...