Pandas: выбранный фрейм данных совпадает и не соответствует условию

#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)