Почему я не могу получить правильные столбцы маски в pandas - PullRequest
2 голосов
/ 16 марта 2020

Например, если у меня есть фрейм данных

    x   f
0   0   [0, 1]
1   1   [3]
2   2   [2, 3, 4]
3   3   [3, 6]
4   4   [4, 5]

Если я хочу удалить строки, столбцы которых отсутствуют в столбцах f, я попытался применить метод куда и применить, но не могу получить ожидаемые результаты. Я получил таблицу ниже, и я хочу знать, почему строки 0,2,3 равны 0 вместо 1?

    x   f   mask
0   0   [0, 1]  0
1   1   [3] 0
2   2   [2, 3, 4]   0
3   3   [3, 6]  0
4   4   [4, 5]  0

Кто-нибудь знает почему? И я должен сделать, чтобы обработать это число против дела списка?

df1 = pd.DataFrame({'x': [0,1,2,3,4],'f' :[[0,1],[3],[2,3,4],[3,6],[3,5]]}, index = [0,1,2,3,4])
df1['mask'] = np.where(df1.x.values in df1.f.values ,1,0)

Ответы [ 2 ]

3 голосов
/ 16 марта 2020

Здесь необходимо проверить значения по парам - решение с in в понимании списка:

df1['mask'] = np.where([a in b for a, b in df1[['x', 'f']].values],1,0)

Или с DataFrame.apply и axis=1:

df1['mask'] = np.where(df1.apply(lambda x: x.x in x.f, axis=1),1,0)

print (df1)
   x          f  mask
0  0     [0, 1]     1
1  1        [3]     0
2  2  [2, 3, 4]     1
3  3     [3, 6]     1
4  4     [3, 5]     0
2 голосов
/ 16 марта 2020

IIU C взорвать строку, затем использовать isin

pd.DataFrame(df1.f.tolist()).isin(df1.x).any(1).astype(int)
Out[10]: 
0    1
1    0
2    1
3    1
4    0
dtype: int32
df1['mask'] = pd.DataFrame(df1.f.tolist()).isin(df1.x).any(1).astype(int)
...