Ошибка длины при попытке проверить, существует ли значение в другом столбце панд - PullRequest
0 голосов
/ 08 октября 2019

Я хочу вернуть столбец Scoring Site, который отражает P2 Actual Scan Site, но только если P2 Actual Scan Site считается действительным.

Входные данные:

Кадр данных sites_exams_df, включая столбецкоторый проверяет правильность Valid Site for Exam?, например:

      SCI    DBN4 Valid Site for Exam?
0      NaN  02L298                  NaN
1      NaN  02L416                  NaN
2      NaN  02L420                  NaN
3   SCI,    02L475               02L475

Мой текущий фрейм данных с P2 Actual Scan Site:

P2 Actual Scan Site
0         -
1    10L445
2    10L445
3    02L475
4    02L475
5    27L400
6    00000C

Желаемый вывод:

  P2 Actual Scan Site  Scoring Site
0                   -           NaN      
1              10L445        10L445
2              10L445        10L445
3              02L475        02L475
4              02L475        02L475      
5              27L400        27L400
6              00000C           NaN

Примечаниечто последний школьный код возвращает NaN, поскольку он не считается действительным сайтом (а также -).

Все остальные школьные коды возвращаются в том виде, в каком они есть.

Текущий код:

# create Scoring Site column
sites_exams_df['Valid Site for Exam?'] = np.where(sites_exams_df[exam].notnull(),sites_exams_df['DBN4'],
                                                  np.nan) # check what scoring sites are there for this exam
valid_sites = sites_exams_df['Valid Site for Exam?'].dropna().values

# attempt 1
df['Scoring Site'] = np.where(df['P2 Actual Scan Site'] in valid_sites,
                              df['P2 Actual Scan Site'],np.nan)

# attempt 2
df['Scoring Site'] = df.apply(lambda x: df['P2 Actual Scan Site'] if x in valid_sites else np.nan)

Оба дают мне ошибки длины:

попытка 1 - raise ValueError("Lengths must match to compare") ValueError: Lengths must match to compare

попытка 2 - ValueError: ('Lengths must match to compare', 'occurred at index DBN - Exam')

1 Ответ

0 голосов
/ 09 октября 2019

Это должно решить вашу проблему:

# create Scoring Site column
sites_exams_df['Valid Site for Exam?'] = np.where(sites_exams_df[exam].notnull(),sites_exams_df['DBN4'],
                                                  np.nan) # check what scoring sites are there for this exam
valid_sites = list(sites_exams_df['Valid Site for Exam?'].dropna())

df['Scoring Site'] = df['P2 Actual Scan Site'].map(lambda x: x if x in valid_sites else np.nan)

map - это операция, которую следует использовать.

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