Как отфильтровать значения из фрейма данных pandas?

#python #python-3.x #pandas #dataframe

#python #python-3.x #pandas #фрейм данных

Вопрос:

У меня есть два фрейма данных. Мне нужно отфильтровать некоторые значения из основного фрейма данных. Мне нужна помощь, чтобы сделать это. Не могли бы вы мне помочь?

Объясните:

df_main:

 kol_id|jnj_id|kol_full_nm|foc_area_id|thrc_cd|thrc_nm|dis_area|dis_area_nm|expert_score|pub_scor|rx_scor|refrl_scor|clincl_rsrchr_scor|is_kol
101152|7124166|Constance Ann Benson|1|VIR|VIR|HIV|HIV|45.17|68.5|0|1.69|88|Y
251489|7822721|Mariam S Aziz|1|VIR|VIR|HIV|HIV|44.33|39.5|33|34.26|76|Y
100856|7356682|William Rodney Short|1|VIR|VIR|HIV|HIV|49.49|44|57.5|50.39|48|Y
251460|7933108|Laura A Guay|1|VIR|VIR|HIV|HIV|34.8|63|0|0|48|N
  

df2:

 filter   filter_value    columns       user_id  password    api_name
kol_id    101152          kol_id        vmani4  abede1234      KOL
thrc_nm    VIR            jnj_id        vmani4  abede1234      KOL
jnj_id    7124166         kol_full_nm   vmani4  abede1234      KOL
                          thrc_cd       vmani4  abede1234      KOL
  

Я должен отфильтровать значения из df_main с помощью df2.
В df2 у него есть 3 столбца — filter, filter_value и columns. Итак, я должен создать оператор сопоставления следующим образом —

 if(kol_id == '101152' and thrc_nm == 'VIR' and jnj_id == '7124166')
   Then extract only those column records from df_main which is present in df2['columns']
  

Но проблема в том, что записи столбцов filter и filter_value не определены, что означает, что они меняются на api_name . Итак, мне нужно написать код, который применим ко всем API.
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Означает конечный результат

 df_result:

kol_id|jnj_id|kol_full_nm|thrc_cd|
101152|7124166|Constance Ann Benson|VIR
  

Ответ №1:

Надеюсь, это сработает —

 ## For this case you'll have to add these 2 lines to avoid comparing str to int
## and to avoid nans in last row of df2
df_final = df_main.copy().astype(str)
df2 = df2[:3].astype(str)

for i, row in df2.iterrows():
    df_final = df_final[df_final[row['filter']]==row['filter_value']]
  

Комментарии:

1. Ошибка — объект ‘tuple’ не имеет атрибута ‘filter’

2. О да, извините, iterrows возвращает кортеж i, строку, я отредактирую

3. Также filter — это специальное слово, поэтому я добавлю его в str на всякий случай

4. Я получаю пробел в df_final

5. Также пусто с row[‘filter’] вместо row.filter ?

Ответ №2:

Сначала я взял два столбца — filter и filter_value из фрейма данных. создан временный фрейм данных. Затем я транспонировал временный фрейм данных, сбросил индекс и удалил заголовки.

 filter_u = df['filter'].unique()
filter_u = [str(i) for i in filter_u]
filter_u = ' '.join(filter_u).split()
column_u = df['columns'].unique()
column_u = [str(i) for i in column_u]
column_u = ' '.join(column_u).split()
print(filter_u)
print(column_u)
df_t1 = df[['filter', 'filter_value']]
df_t1 = df_t1.transpose().reset_index(drop=True)
df_t1 = df_t1.astype(str)
df_t1.columns = df_t1.iloc[0]
df_t1 = df_t1.reindex(df_t1.index.drop(0)).reset_index(drop=True)
df_t1.columns.name = None
  

вывод приведенного выше кода:

    kol_id thrc_nm     jnj_id
0  101152     VIR  7124166.0
  

Затем я прочитал основной файл как фрейм данных и объединился с указанным выше фреймом данных, и, наконец, я получил результат, какой я хочу.

 df_main = pd.read_csv("/medaff/Scripts/python/vinooth/kol_scores.txt", delimiter = '|')
df_main = df_main.astype(str)
print(df_main.head())

df_3=pd.merge(df_main,df_t1,on=filter_u,how='inner')
df_3 = df_3[df_3.columns amp; column_u]
print(df_3)
df_3.to_json('/medaff/Scripts/python/vinooth/output/out.json', orient='records')
  

Таким образом, я получил окончательный результат:

    kol_id     jnj_id           kol_full_nm thrc_cd
0  101152  7124166.0  Constance Ann Benson     VIR