Как ускорить доступ к списку диктов в столбце панд данных? - PullRequest
1 голос
/ 30 мая 2019

Это может звучать как сумасшедший способ хранения данных, но я работаю с разреженными данными, и в попытке сэкономить место, я создал фрейм данных, где один столбец представляет собой список диктов переменной длины (от 1 до болеедюжина диктов с тремя элементами каждый).Я пытаюсь получить доступ ко второму элементу в каждом dict и создать новый столбец только со списком этих вторых элементов.На самом деле я не могу вставить свои данные, однако могу привести пример, который близко приближает их.

Представьте, что у меня есть данные с характеристиками моих кошек, собак и хомяков, и у меня было 3 кошки, 1 собака и 1 хомяк, каждый с данными о цвете и длине меха.Я в основном пытаюсь получить доступ к списку конкретных атрибутов для каждого типа животных.Теперь код ниже работает просто отлично.Однако, если вы расширите его до более чем 22 000 строк, это ОЧЕНЬ невероятно медленно.Вероятно, это связано с циклом for.

df = pd.DataFrame({'name':['cats','dogs','hamsters'],'attributes':[[{'color':'white','fur':'short'},{'color':'black','fur':'long'},{'color':'gray','fur':'long'}],[{'color':'brown','fur':'short'}],[{'color':'brown','fur':'short'}]]})


df['colors']=''
for i in range(len(df)):
  attributes = df.attributes.iloc[i]
  df.loc[i,['colors']] = [list(map(lambda x: x['color'],attributes))]

df до:

       name                                         attributes
0      cats  [{'color': 'white', 'fur': 'short'}, {'color':...
1      dogs               [{'color': 'brown', 'fur': 'short'}]
2  hamsters               [{'color': 'brown', 'fur': 'short'}]

df после:

       name  ...                colors
0      cats  ...  [white, black, gray]
1      dogs  ...               [brown]
2  hamsters  ...               [brown]

Я ищу способускорить этот процесс, возможно, с помощью лямбда-функции?Не уверен, но почти всегда есть способ прервать цикл for, однако я просто не могу его увидеть.

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Попробуйте с

l=[[y['color'] for y in x] for x in df.attributes]
l
Out[321]: [['white', 'black', 'gray'], ['brown'], ['brown']]
df['color']=l
1 голос
/ 30 мая 2019

Сначала это делается с помощью функции (которая может легко быть лямбда-выражением, если хотите) и метода dataframe.apply ().

def extract_colors(x): 
    return list(map(lambda a: a["color"], x)) 

df["colors"] = df.attributes.apply(extract_colors)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...