Как поместить значения pandas кадра данных в для l oop в python? - PullRequest
0 голосов
/ 05 апреля 2020

Это часть Python программы API Connection

Вот пример DataFrame

      Region  Sector  Brand ID  Start Date
7188  US      41      40000     2006-03-06
7189  US      41      40345     2017-11-06
7190  US      41      40123     2019-01-12
7191  US      42      40145     2001-02-06
7192  US      42      40185     2013-03-16

Вот рабочая функция в составе программы API python, которая обычно принимает фиксированные значения параметров, т.е. Регион, сектор, идентификатор бренда, дата начала, дата окончания = "05-04-2020", оценка = "общая". (Дата окончания и оценка являются фиксированными значениями, остальные изменяются).

#This code is working if manually enter
#details of a Dataframe one by one which is inefficient.
#This code generates me a URL of a dataset using the parameters

querySingleBrandTimeline('db.csv', {'region':'us','sector':'41', 'brand_id':'40000', 'scoring':'total', 'start_date':'2006-03-06','end_date':'2020-03-31'})

Я пытаюсь достичь значения l oop, которое берет значения из pandas DtaFrame и соответственно помещает его в параметры функции.

Здесь пример кода, который я пробовал:

for id in US['Sector']:
  for brandid in US['Brand ID']:
    querySingleBrandTimeline('db.csv', {'region':{}.format(US['Region']),'sector':{}.format(US['Category ID']), 'brand_id':{}.format(US['Brand ID']), 'scoring':'total'}, 'start_date':{}.format{US['Start Date']},'end_date':'2020-03-31'})

Я не совсем уверен, как динамически передавать значения DataFrame в функцию

Ответы [ 3 ]

2 голосов
/ 05 апреля 2020

Я думаю, что iterrows здесь не является необходимым, потому что самое медленное итеративное решение в pandas (и вывод - Series, здесь необходимы необходимые дикты).

Сначала добавьте скалярные столбцы в DataFrame и переименуйте имена столбцов:

df1 = df.rename(columns={'Start Date':'start_date'}).rename(columns=str.lower)
df1.insert(3, 'scoring', 'total')
df1['end_date'] = '2020-03-31'
df1['start_date'] = df1['start_date'].dt.strftime('%Y-%m-%d')

print (df1)
     region  sector  brand id scoring  start_date    end_date
7188     US      41     40000   total  2006-03-06  2020-03-31
7189     US      41     40345   total  2017-11-06  2020-03-31
7190     US      41     40123   total  2019-01-12  2020-03-31
7191     US      42     40145   total  2001-02-06  2020-03-31
7192     US      42     40185   total  2013-03-16  2020-03-31

А затем преобразовать в список диктов по DataFrame.to_dict и l oop:

for d in df1.to_dict('record'):
    print (d)

{'region': 'US', 'sector': 41, 'brand id': 40000, 'scoring': 'total', 'start_date': '2006-03-06', 'end_date': '2020-03-31'}
{'region': 'US', 'sector': 41, 'brand id': 40345, 'scoring': 'total', 'start_date': '2017-11-06', 'end_date': '2020-03-31'}
{'region': 'US', 'sector': 41, 'brand id': 40123, 'scoring': 'total', 'start_date': '2019-01-12', 'end_date': '2020-03-31'}
{'region': 'US', 'sector': 42, 'brand id': 40145, 'scoring': 'total', 'start_date': '2001-02-06', 'end_date': '2020-03-31'}
{'region': 'US', 'sector': 42, 'brand id': 40185, 'scoring': 'total', 'start_date': '2013-03-16', 'end_date': '2020-03-31'}
1 голос
/ 05 апреля 2020

Итерирование кадра данных по строкам с помощью iterrows (). Я верю, что ваш фрейм данных называется США. Тогда:

for(index, row_data) in US.iterrows():
        querySingleBrandTimeline('db.csv', {'region':{}.format(row_data['Region']),'sector':{}.format(row_data['Category ID']), 'brand_id':{}.format(row_data['Brand ID']), 'scoring':'total'}, 'start_date':{}.format{row_data['Start Date']},'end_date':'2020-03-31'})
0 голосов
/ 05 апреля 2020

Редактировать: Подход Джезраэля гораздо лучше для того, что вы хотите сделать, хотя.

Для перебора кадра данных pandas по строкам вы можете использовать pandas .DataFrame.iterrows

import pandas as pd

df = pd.DataFrame({
    'col1':[1,5,3,54,34,56,45],
    'col2':['foo','bar','foo','foo','bar','foo','foo'],
    'col3':[True,True,False,True,True,False,True]})

for idx, row in df.iterrows():
    if row['col3']:
        print('\n'+str(idx))
        print(row['col2']+'_'+str(row['col1']))

Вывод:

0
foo_1

1
bar_5

3
foo_54

4
bar_34

6
foo_45
...