#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть два DFS следующим образом:
ID | A | B
1 0 1
2 1 2
3 2 2
Type | Name
1 | ...
2 | ...
1 | ...
Я хочу два фрейма данных из первого. Первый содержит только строки, где во ВТОРОМ DF есть Type == 1
, а другой содержит строки, где во втором DF, Type != 1
. Это мой пример желаемого результата:
First DF:
ID | A | B
1 0 1
3 2 2
Second DF:
ID | A | B
2 1 2
Давайте вызовем первый df
и второй df_other
. Я попробовал это, но это выдало мне ошибку
idx = df_other["Type"] == 1
df1 = df[~df.index.isin(idx)]
df2 = df[df.index.isin(idx)]
Я также пробовал loc[idx]
и .iloc[idx, :]
, но они также дали неверный результат. Любая помощь приветствуется.
Комментарии:
1. Если вы вызываете «первый»
df
, как уdf_other
вас есть столбецA
? И почему вы проверяетеA == 0
, хотите ли вы знать, гдеType == 1
?2. Отредактировал мой ответ. Извините, когда я пытался придумать простое объяснение, я забыл изменить его обратно.
3. Просто удалить
df.index.isin
из обеих строк? Еслиdf
иdf_other
имеют соответствующие строки4.Он выдает ошибку
IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
df
иdf_other
имеет одинаковое количество строк, но разные столбцы,
Ответ №1:
Давайте вызовем ваши df1
фреймы данных и df2
. Я предполагаю, что оба имеют одинаковую длину.
import numpy as np
import pandas as pd
mask1 = np.select([df2['Type']==1, [True], default=False) #this creates a pandas series with True values were df2['Type'] is 1 and False everywhere else.
#### Your first dataframe would be
df1[mask1]
#### Your second dataframe is
df1[~mask1]
# if you want to save them as dataframes best use .copy() i.e.:
df_type1 = df1[mask1].copy()
df_typeNot1 = df1[~mask1].copy()
Ответ №2:
Если это одинаковое количество строк, и каждый фрейм данных имеет правильную сортировку, объединение / объединение их выполняет фильтрацию:
data = {
'ID':[1,2,3],
'A':[0,1,2],
'B':[1,2,2],
}
dfa = pd.DataFrame(data)
data1 = {
'Type':[1,2,1],
'Name':['---','---','---']
}
dfb = pd.DataFrame(data1)
df_merged = pd.concat([dfa, dfb], axis=1)
df1 = df_merged.loc[df_merged['Type']==1][['ID', 'A', 'B']].set_index('ID')
df2 = df_merged.loc[df_merged['Type']!=1][['ID', 'A', 'B']].set_index('ID')
print(df1)
print(df2)