Как удалить определенные элементы массива в одном столбце, используя массив условий других столбцов в pandas - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь просмотреть размер массива данных в одном из столбцов, используя массив условий из других столбцов. Например, у меня есть мои данные, как показано ниже: df:

df= pd.DataFrame({'nHit':[4,3,5],'hit_id':[[10,20,30,50],[20,40,50],[30,50,60,70,80]],'hit_val':[[1,2,3,4],[5,6,7],[8,9,10,11,12]]},index=[0,1,2])

Я хочу знать, есть ли способ переместить все значения в столбцах hit_val на основе условия массива hit_id (например, сохранить только соответствующие значения той же позиции hit_id = 30 или 50). Вывод, который я предполагаю получить, выглядит примерно так: df:

df= pd.DataFrame({'nHit':[2,1,2],'hit_id':[[30,50],[50],[30,50]],'hit_val':[[3,4],[7],[8,9,10]]},index=[0,1,2])

Моя мысль - создать массив условий из столбцов hit_id с помощью df.apply (), а затем использовать его для фильтрации hit_val, кто-нибудь знает как реализовать?

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Из того, что я понимаю, начиная с оригинального df, вы можете explode и cols и фильтровать условие, затем groupby с agg как list:

l = [30,50]
m = pd.concat([df[i].explode() for i in ['hit_id','hit_val']],axis=1)
out = m[m['hit_id'].isin(l)].groupby(level=0).agg(list)
out.insert(0,'nHit',out['hit_id'].str.len())
print(out)

   nHit    hit_id hit_val
0     2  [30, 50]  [3, 4]
1     1      [50]     [7]
2     2  [30, 50]  [8, 9]
0 голосов
/ 13 марта 2020

Используя copy-n-paste из двух выражений (спасибо), вот их отображения (которые должны помочь нам визуализировать желаемое действие:

In [247]: df                                                                                   
Out[247]: 
   nHit                hit_id             hit_val
0     4      [10, 20, 30, 50]        [1, 2, 3, 4]
1     3          [20, 40, 50]           [5, 6, 7]
2     5  [30, 50, 60, 70, 80]  [8, 9, 10, 11, 12]

In [249]: df1                                                                                  
Out[249]: 
   nHit    hit_id     hit_val
0     2  [30, 50]      [3, 4]
1     1      [50]         [7]
2     2  [30, 50]  [8, 9, 10]
...