Pandas dataframe OrderedDict извлекает данные

У меня есть файл базы данных .csv с одним столбцом и 3 строками, это данные, экспортированные из отдела продаж с помощью simple-salesforce, я пытаюсь получить значение «Имя» из данных ячейки OrderedDict («Имя», «Спрос». ').

Датафрейм

Type__c
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')])

с приведенным ниже кодом я читаю файл csv, и для каждой строки я присваиваю значение, содержащее «OrderedDict ([....) для имени, и я хочу напечатать значение поля «Имя»,

import pandas as pd
from collections import OrderedDict
df = pd.read_csv('Database.csv')
for index, row in df.iterrows():
    name = df._get_value(index, 'Type__c')
    base=OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234500000001erAAA')])), ('Name', 'Private')])
    print("\n",name['Name'])
    print(base['Name'])

Полученные результаты:

.
print("\n",name['Name'])
    TypeError: string indices must be integers

когда я меняю print("\n",name['Name']) на print("\n",name) для проверки добавленного вручную OrderedDict, я вижу, что это работает

import pandas as pd
from collections import OrderedDict
df = pd.read_csv('Database.csv')
for index, row in df.iterrows():
    name = df._get_value(index, 'Type__c')
    test=OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234500000001erAAA')])), ('Name', 'Private')])
    ***print("\n",name)***
    print(test['Name'])

Результат:

 OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
Private

 OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
Private

 OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')])
Private

У меня есть файл с тысячами строк, и должен быть способ создать новый столбец с именем «Имя» и добавить текстовые данные.

в конце я хочу достичь ОТ

Type__c
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')])
        OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')])

К

Name
Demand
Demand
Stand
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в SO-сообщество Памук!

Вместо того, чтобы перебирать строки фрейма данных, гораздо эффективнее «применить» конкретную функцию ко всему столбцу (или даже к подмножеству фрейма данных). Таким образом, pandas будет обрабатывать производительность за вас, и обычно она более читабельна (поскольку вам не нужно добавлять какую-либо итерирующую логику).

Вот как вы можете получить этот столбец «Имя» с применением и быстрой лямбда-функцией (для вас важна только последняя строка, остальное — для репликации вашего примера фрейма данных):

from collections import OrderedDict
import pandas as pd

data = [
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')]),
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/1234400000001ddAAA')])), ('Name', 'Demand')]),
    OrderedDict([('attributes', OrderedDict([('type', 'Type__c'), ('url', '/services/data/v42.0/sobjects/Type__c/123430000004C93AAE')])), ('Name', 'Stand')]),
]

df = pd.DataFrame({"Type__c": data})
df["Name"] = df["Type__c"].apply(lambda x: x["Name"])

Дополнительные примеры и подробности см. в документации Pandas Series.apply с df["Type__c"].

Для более сложных операций со строками, которые включают одновременное использование большего количества столбцов, вы можете проверить документы для DataFrame.apply и применить функцию к самому фрейму данных (или его подмножеству).

Для более читаемой части документов, которая очень важна для того, что вы делаете, обратитесь к разделу «Руководство пользователя Pandas» в Приложение-функция.

Привет, спасибо за приветствие, ваш пример кода хорошо работает как скрипт, к сожалению, моя проблема заключается в том, что когда я читаю фрейм данных из csv, я получаю следующую ошибку кода с вашим кодом: at df = pd.DataFrame({" Type__c": data}) и ошибка ValueError: при использовании всех скалярных значений необходимо передать индекс. Я предполагаю, что если вы напишете в коде OrderedDict, он распознает это и обработает, но если я попытаюсь прочитать текст из фрейма данных, он не запустит OrderedDict.

Pamuk 25.12.2020 11:55

Я просто попытался сохранить данные в файл и прочитать оттуда, и у меня это сработало. Кстати, вы должны использовать только последнюю строку кода df["Name"] = df["Type__c"].apply(lambda x: x["Name"]). Эта ошибка больше похожа на то, что переменная данных не является списком (или итерируемой) (см. этот вопрос --> stackoverflow.com/questions/17839973/…).

WillMonge 26.12.2020 21:22

Другие вопросы по теме