логическое и индексирование в Pandas - PullRequest
1 голос
/ 08 октября 2019

Предположим, у меня есть фрейм данных df и индекс столбца idx - тогда я могу получить новый фрейм данных только со столбцами из idx и значениями, равными 1 на

df_1=df[df==1].iloc[idx]

но я думаю, что где-то читал, что срезать таким образом неэффективно, поскольку первый df[df==1] создает новый фрейм данных, который затем нарезается.

Действительно ли это не так? можно сделать это в одну строку, например df_1=df[df==1,idx] или df_1=df.iloc[df==1,idx]

РЕДАКТИРОВАТЬ: добавлен образец данных

(я знаю, что это выглядит как массив np.array,но это pd.DataFrame)

df=[[1,1,0,0,0], [0,0,0,0,0], [0,0,0,0,1]] ожидаемый доход

df_1=[[1,1,0], [0,0,1]]

1 Ответ

1 голос
/ 08 октября 2019

Первое возможное решение - проверить все строки на 1, а затем отфильтровать столбцы по idx:

df= pd.DataFrame([[1,1,0,0,0],
                  [0,0,0,0,0],
                  [0,0,0,0,1]], columns=list('abcde'))

idx = [0,1,4]
df_1 = df.iloc[(df==1).any(axis=1).values, idx]
print (df_1)
   a  b  e
0  1  1  0
2  0  0  1

Сведения :

print (df==1)
       a      b      c      d      e
0   True   True  False  False  False
1  False  False  False  False  False
2  False  False  False  False   True

Илисначала отфильтруйте столбцы по idx, а затем проверьте 1:

df_1 = df.iloc[(df.iloc[:, idx]==1).any(axis=1).values, idx]

Detail :

print (df.iloc[:, idx]==1)
       a      b      e
0   True   True  False
1  False  False  False
2  False  False   True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...