【问题标题】:How to put values of pandas dataframe into a for loop in python?如何将熊猫数据框的值放入python中的for循环中?
【发布时间】:2020-07-17 04:28:15
【问题描述】:

这是 Python API 连接程序的一部分

这是 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 程序一部分的工作函数,它通常采用固定的参数值,即; Region, Sector, Brand ID, Start Date, End Date="05-04-2020", Scoring ="total"。(End Date 和 Scoring 是固定值,其余都是不断变化的)。

#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'})

我想要实现的是一个 for 循环,它从 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 的值动态传递给函数

【问题讨论】:

标签: python pandas loops for-loop


【解决方案1】:

我认为 iterrows 这里没有必要,因为 pandas 中最慢的迭代解决方案(输出是系列,这里是必要的字典)。

首先将标量列添加到 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 转换为字典列表并循环:

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'}

【讨论】:

  • 如何将这些值传递给 querySingleBrandTimeline() 函数。该列表正在将时间转换为时间戳,无法解析。{, 'brand_id': 400000, 'end_date': '2020-03-31', 'region': 'US', 'scoring': 'total', 'sector': 20, 'start_date': Timestamp('2018-12-13 00:00:00')}
  • @SaiDiwakarBhrugubanda - 你能在循环之前添加df1['start_date'] = df1['start_date'].dt.strftime('%Y-%m-%d')吗?
  • 在 dataframe 中,格式为 (Y,m,d) 但当dataframe.to_dict('record) 格式转换为时间戳并显示'start_date': Timestamp('2018-12-13 00:00:00')
  • @SaiDiwakarBhrugubanda - 是的,明白。你试试edited answer
【解决方案2】:

使用 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'})

【讨论】:

  • 无效语法 :for(index, US) in US.iterrows(): querySingleBrandTimeline('db.csv', {'region':{}.format(US['Region']), 'sector':{}.format(US['Category ID']), 'brand_id':{}.format(US['Brand ID']), 'scoring':'total'}, 'start_date':{ }.format{US['开始日期']},'end_date':'2020-03-31'})
  • 不是for(index, US) in US.iterrows(),是for(index, row_data) in US.iterrows(),然后使用row_data['Region']等@SaiDiwakarBhrugubanda访问
【解决方案3】:

编辑: Jezrael's approach 更适合您想做的事情。

要逐行遍历 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

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2020-08-09
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多