#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 за поздний ответ… У меня действительно были проблемы с кодировкой, например
 
, incolumn1
, и в конечном итоге мне удалось заставить его работать с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
, где ключ словаря соответствует критериям