Как удалить определенные значения из pandas кадра данных, которых нет в списке? - PullRequest
2 голосов
/ 04 апреля 2020

Путем написания следующего кода я создаю фрейм данных

data = [['A', 'B','D'], ['A','D'], ['F', 'G','C','B','A']] 
df = pd.DataFrame(data) 
df

enter image description here

Моя цель - удалить значения из фрейма данных, которые не находятся в список ниже.

list_items = ['A','B','C']

Мой ожидаемый результат такой же, как и в

enter image description here

Я попытался просмотреть значения в циклах и проверить один за другим, но предположим, что кадр данных очень большой по размеру (9108, 1616), и в списке содержится более 130 элементов, которые необходимо проверить. В этом случае выполнение кода занимает слишком много времени. Пожалуйста, предложите наиболее эффективный способ достижения ожидаемого результата.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

Я не думаю, что делать это в pandas - это хорошая идея, поскольку столбцы здесь не имеют значения. Это проще сделать с помощью списков, которые в конце можно преобразовать в pandas фрейм данных, если он вам действительно нужен.

# convert df to list of lists
data = df.values.tolist()
# filter each element of the list to contain only list_items values
data_filtered = [ [el for el in l if el in list_items] for l in data]
# convert back to dataframe
df_filtered = pd.DataFrame(data_filtered) 
print(df_filtered)
#   0   1    2
#0  A   B    None
#1  A   None None
#2  C   B    A
1 голос
/ 04 апреля 2020

Давайте попробуем не использовать для l oop

s=df.where(df.isin(list_items)).reset_index().melt('index').dropna()
s=s.assign(Key=s.groupby('index').cumcount()).pivot('index','Key','value')
Key    0    1    2
index             
0      A    B  NaN
1      A  NaN  NaN
2      C    B    A

Второй метод не подходит для большого кадра данных

s=df.where(df.isin(list_items)).T.apply(lambda x : sorted(x,key=pd.isnull)).T.dropna(thresh=1, axis=1)
   0    1    2
0  A    B  NaN
1  A  NaN  NaN
2  C    B    A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...