Фильтровать фрейм данных на основе значений словаря столбцов

#python #dataframe

#python #фрейм данных

Вопрос:

Dataframe ( df ) содержит столбец с этими значениями:

column1 :

 Sometext1
Sometext2
{‘a’: 1}
{‘b’: 2}
Sometext3
Sometext4
{‘c’: 3}
{‘d’: 4}
Sometext5
Sometext6
{‘e’: 5}
{‘f’: 6}
 

Как я могу выбрать только строки df , в которых, скажем column1 , содержится dict ключ: ‘a’?

Ответ №1:

Проблема в том, что элементы, отформатированные как словарь в вашем столбце, по-прежнему имеют строковый тип данных. Вот решение с использованием .apply():

 import pandas as pd

df = pd.read_csv('sample.csv', header=None)
print('BEFORE:n', df)

target_key = 'a'
df[0] = df.apply(lambda x: x[0] if x[0][0] == '{' and x[0][2] == target_key else None, axis = 1)
df.dropna(inplace=True)
print('nAFTER:n', df)

#output:
BEFORE:
             0    1
0   Sometext1   aa
1   Sometext2   bb
2    {‘a’: 1}   vc
3    {‘b’: 2}   sd
4   Sometext3   we
5   Sometext4   df
6    {‘c’: 3}   fg
7    {‘d’: 4}   gh
8   Sometext5  asw
9   Sometext6   qw
10   {‘e’: 5}   fg
11   {‘f’: 6}   as

AFTER:
           0   1
2  {‘a’: 1}  vc
 

Комментарии:

1. Все значения column1 None после запуска df.apply(lambda x: ... )

2. Я попробовал это на ваших данных, как показано выше, и это сработало. В вашем фрейме данных должно быть что-то особенное. Если вам нужна помощь в устранении неполадок, преобразуйте свой фрейм данных в словарь с помощью df.to_dict , распечатайте словарь и вставьте его выше, чтобы я мог работать над ним.

3. Извините @pakpe за поздний ответ… У меня действительно были проблемы с кодировкой, наприме𠬆 , in column1 , и в конечном итоге мне удалось заставить его работать с lambda x: eval(x[0]).get(c)

Ответ №2:

Вы можете сделать это, выполнив итерацию в элементе вашего df и используя с isinstance

 for elem in df:
    if isinstance(elem, dict):
        if 'a' in elem.keys() :
            print (elem)
           #do whatever you Want with elem
 

Комментарии:

1. Спасибо за быстрое воспроизведение @Renaud, которое я пытался использовать for elem in df.iloc[:, i].tolist(): , но print (elem) ничего не возвращает 🙁 … Есть идеи, почему? Значения выглядят как строки AttributeError: 'str' object has no attribute 'keys'

2. Знаете ли вы, как это сделать с apply applymap lambda помощью выражения или и? Таким образом, весь фрейм данных обновляется на основе значений столбцов column1 , где ключ словаря соответствует критериям