pandas фрейм данных, как преобразовать объект в массив и извлечь значение массива - PullRequest
0 голосов
/ 23 февраля 2020

прости меня, если мой вопрос был немного двусмысленным. Я буду стараться быть лучше младшего BB.

Вопрос.

У меня есть DataFrame, как показано ниже, который я получил из базы данных улья.

Как извлечь значение 'cat' и 'animal', 'dog' в столбце col2, что угодно.

In[]:
sample = {'col1': ['cat', 'dog'], 'col2': ['WrappedArray([animal], [cat])', 'WrappedArray([animal], [dog])']}
df = pd.DataFrame(data=sample)
df

out[] :
    col1                            col2
-----------------------------------------
0   cat     WrappedArray([animal], [cat])
1   dog     WrappedArray([animal], [dog])

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

In[]: df['col2'][0][1]
Out[]: cat

если я ошибаюсь, я должен попробовать другой способ, потому что я новичок ie для Pandas Dataframe. Может кто-нибудь дать мне знать, как это работает?

спасибо заранее.

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Данные во втором столбце col2 выглядят просто строками.

Вывод из df['col2'][0][1] будет "r", который является вторым символом (индекс 1) в первой строке. Чтобы получить "cat", вам нужно изменить строки и удалить 'WrappedArray([animal]...'. оставив только актуальные данные. "кошка", "собака", и т. д. c.

Вы можете попробовать df['col2'].iloc[0][24:27], но это не общее решение. Это также будет хрупким и неприемлемым.

Если у вас есть любой контроль над тем, как данные экспортируются из базы данных, попробуйте вывести данные в более чистом формате, то есть без вещи WrappedArray(....

Регулярные выражения могут быть полезны здесь.

Вы можете попробовать что-то вроде этого:

import re

wrapped = re.compile(r'\[(.*?)\].+\[(.*?)\]')
element = wrapped.search(df['col2'].iloc[0]).group(2)

* Опасно Опасно Опасно *

Если вам нужна эта функциональность. Вы можете создать WrappedArray функция, которая возвращает содержимое в виде списка строк и т. Д. Затем вы можете вызвать его с помощью eval(df['col2'][0][1]).

Не делайте этого.

FYI:

Вероятно, ваши dtypes по умолчанию настроены на объект, поскольку вы не указали их при создании фрейма данных. Это можно сделать так:

df = pd.DataFrame(data=sample, dtype='string')

Также рекомендуется используйте ilo c для индексации фреймов данных по индексу.

0 голосов
/ 24 февраля 2020

Я решил, как @rkedge посоветовал мне

данные записаны на иностранном языке.

Как я уже говорил, DataFrame имеет объектные данные, записанные с помощью 'WrappedArray ([우주 ご ぎ ゅ]) , [ぎ ゃ], [한국어]) '.

df_ = df['col2'].str.extractall(r'([REGEX expression]+)')
df_

0   0   우주ごぎゅ
0   1   ぎゃ
0   2   한국어
1   0   cat
2   0   animal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...