#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