Есть ли способ объединить три дикта из трех отдельных циклов for? - PullRequest
0 голосов
/ 29 мая 2018

Я использую Pandas для создания трех списков на основе данных из трех отдельных столбцов моего CSV-файла.Мои списки:

order_list = df['order'][:10].tolist()) 
user_id_list = df['user_id'][:10].tolist())
company_id_list = df['company_id'][:10].tolist())

Внутри моей функции create_order() я перебираю каждый список и использую enumerate(), чтобы добавить элементы к трем отдельным диктам.Например:

def create_order(orders, users, companies):

    for index, order in enumerate(orders):
        x = {
            'name': order,
        }
    for index, user_id in enumerate(users):
        y = {
            'user': user_id,
        }
    for index, company_id in enumerate(companies):
        z = {
            'company': company_id,
        }

if __name__ == '__main__':
    create_order(order_list, user_id_list, company_id_list)

Я хочу объединить все три диктанта и вернуть данные для каждой строки данных из моего файла CSV.Однако мне нужно, чтобы объекты order были уникальными.Мне удалось объединить возвращенные сообщения, используя распаковка обобщений .например, {**x, **y}.Единственный способ, которым я могу выполнить объединение слов, если я создаю вложенные циклы for;что мешает мне возвращать уникальные заказы.

Как лучше всего объединить мой словарь в один запрос, чтобы я мог просматривать и возвращать уникальные данные с уникальными заказами?

РЕДАКТИРОВАТЬ с коррекциями

Вот мой исходный вывод DF:

     company_id                 user_id          order
  0         111                     222           order 1
  1         111                     222           order 1
  2         111                     222           order 1
  3         111                     222           order 2
  4         111                     222           order 2
  5         111                     222           order 3

Ниже приведен пример желаемого результата со всеми уникальными ордерами:

company_id   user_id               order
       111       222             order 1
       111       222             order 2
       111       222             order 3

Причиной попытки решить проблему с циклами for была необходимость иметь все необходимые выходные данные для возврата указания на импорт в базу данных через Google DFP API.

Ниже приведен рабочий кодс желаемым выходом благодаря руководству @MeHdi.

df = pd.read_csv('order_data.csv')

order_list = df['order'].tolist()
user_id_list = df['user_id'].tolist()
company_id_list = df['company_id']].tolist()

for x in company_id_list:
    company_id = int(x)

    df = pd.DataFrame(
        {
            'name': order_list,
            'userId': user_id_list,
            'companyId': company_id
        }
    )

 list_obj = df.reindex(columns=['companyId', 'userId', 'name']).drop_duplicates()

 records = list_obj.to_dict('records')
 print(records)

Возвращает желаемый результат, как указано выше.

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете работать с вашим оригинальным DataFrame.Используйте функции reindex и drop_duplicates в вашем DataFrame для достижения требуемого результата.

df = pd.DataFrame({'order':['order1', 'order2', 'order3', 'order3'], 'user_id':[222, 222, 222, 222], 'company_id':[111, 111, 111, 111], 'column_d':['a', 'b', 'c', 'd']})

print(df)

df.reindex(columns=['company_id', 'user_id', 'order']).drop_duplicates()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...