У меня есть файл базы данных .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
Добро пожаловать в 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» в Приложение-функция.
Я просто попытался сохранить данные в файл и прочитать оттуда, и у меня это сработало. Кстати, вы должны использовать только последнюю строку кода df["Name"] = df["Type__c"].apply(lambda x: x["Name"])
. Эта ошибка больше похожа на то, что переменная данных не является списком (или итерируемой) (см. этот вопрос --> stackoverflow.com/questions/17839973/…).
Привет, спасибо за приветствие, ваш пример кода хорошо работает как скрипт, к сожалению, моя проблема заключается в том, что когда я читаю фрейм данных из csv, я получаю следующую ошибку кода с вашим кодом: at df = pd.DataFrame({" Type__c": data}) и ошибка ValueError: при использовании всех скалярных значений необходимо передать индекс. Я предполагаю, что если вы напишете в коде OrderedDict, он распознает это и обработает, но если я попытаюсь прочитать текст из фрейма данных, он не запустит OrderedDict.