Фильтровать фрейм данных Pandas, используя список, но следя за тем, чтобы количество элементов соответствовало количеству в списке

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

итак, у меня есть список

 my_list = [1,1,2,3,4,4]
 

У меня есть фрейм данных, который выглядит следующим образом

 col_1    col_2
a        1
b        1
c        2
d        3
e        3
f        4
g        4
h        4
 

Я в основном хочу, чтобы окончательный фрейм данных выглядел так

 col_1    col_2
a        1
b        1
c        2
d        3
f        4
g        4
 

В принципе, я не могу использовать

 my_df[my_df['col_2'].isin(my_list)]
 

поскольку это будет включать все строки. Я хочу, чтобы первая строка соответствовала каждому элементу в списке, но все то же количество строк.

Ответ №1:

Используйте GroupBy.cumcount для счетчика с исходным и вспомогательным фреймом данных и фильтруйте по внутреннему соединению DataFrame.merge :

 my_list = [1,1,2,3,4,4]

df1 = pd.DataFrame({'col_2':my_list})
df1['g'] = df1.groupby('col_2').cumcount()
my_df['g'] = my_df.groupby('col_2').cumcount()

df = my_df.merge(df1).drop('g', axis=1)

print (df)
  col_1  col_2
0     a      1
1     b      1
2     c      2
3     d      3
4     f      4
5     g      4