【问题标题】:Looping Columns in Dataframes Python3循环数据框 Python 中的列
【发布时间】:2020-05-12 19:42:19
【问题描述】:

我想知道您是否能够根据以下情况进行循环(因为我试图这样做,但似乎无法弄清楚)。

我的数据框有以下标题:

female2['fiscal_year','ratio_loanofficers', 'ratio_female_borrowers', 'ratio_male_borrowers']

我想要做的是在fiscal_year 下获得每年每个比率的平均值。所以,我可能需要为信贷员、女性借款人和男性借款人做三个循环。在fiscal_year 下,有多个 2010、2011、...2019 条目。所以我实际上为实现我的答案所做的是创建一个数据库子集并每年分组,然后得到平均值。它有效...但我想看看循环是否有效(我对 Python 很陌生)。

这是我的初始代码:

for y in range(2010, 2020):
    if y == 2010:
        loan2010 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2011:
        loan2011 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2012:
        loan2012 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2013:
        loan2013 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2014:
        loan2014 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2015:
        loan2015 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2016:
        loan2016 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2017:
        loan2017 += round(female2.ratio_floanofficers.mean(), 3)
    elif y == 2018:
        loan2018 += round(female2.ratio_floanofficers.mean(), 3)
    else:
        loan2019 += round(female2.ratio_floanofficers.mean(), 3)

print(loan2010, loan2011, loan2012, loan2013, loan2014, loan2015, loan2016, loan2017, loan2018, loan2019)

然而,我得到的是每年的相同结果,这向我表明循环没有按我想要的那样工作。

谢谢!

【问题讨论】:

    标签: python-3.x pandas loops dataframe


    【解决方案1】:
    import pandas as pd
    
    # dataframe
    female2 = pd.DataFrame({'fiscal_year': [2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019],
                            'ratio_female_borrowers': [1, 2, 3, 4, 5, 6, 7, 8]})
    
       fiscal_year  ratio_female_borrowers
    0         2018                       1
    1         2018                       2
    2         2018                       3
    3         2018                       4
    4         2019                       5
    5         2019                       6
    6         2019                       7
    7         2019                       8
    
    # calculate mean for loan year into dict
    loans = {f'loan{year}': round(female2[female2.fiscal_year == year]['ratio_female_borrowers'].mean(), 3) for year in range(2010, 2020)}
    
    print(loans)
    
    {'loan2010': nan,
     'loan2011': nan,
     'loan2012': nan,
     'loan2013': nan,
     'loan2014': nan,
     'loan2015': nan,
     'loan2016': nan,
     'loan2017': nan,
     'loan2018': 2.5,
     'loan2019': 6.5}
    
    print(loans['loan2019'])
    
    >>> 6.5
    

    dict comprehension 等效的for-loop

    loans = dict()
    
    for year in range(2010, 2020):
        loans[f'loan{year}'] = round(female2[female2.fiscal_year == year]['ratio_female_borrowers'].mean(), 3)
    

    使用pandas.DataFrame.groupby

    ratio_female_borrowers_mean = female2.groupby(['fiscal_year'], as_index=False)['ratio_female_borrowers'].agg(['mean'])
    
    print(ratio_female_borrowers_mean)
    
                 mean
    fiscal_year      
    2018          2.5
    2019          6.5
    

    【讨论】:

    • 嗨,特伦顿,非常感谢。它非常详细,帮助我巩固了一些 python 编码实践。我使用了 for 循环,它工作得非常好!我使用了 groupby 方法,但我觉得 for-loop 在获取答案方面更复杂一些。谢谢!
    • @joy 很高兴它有帮助。但是,将for-loop 与数据框一起使用被认为是不正确的做事方式。 groupby 是更好的方法。 Fast, Flexible, Easy and Intuitive: How to Speed Up Your Pandas ProjectsReal Python 网站是一个很好的资源,Pandas: User Guide 也是如此。祝你好运。
    • 哦,很高兴知道。我不知道(只是自学)。我确实发现 groupby 方法更容易,尤其是使用数据框。感谢来源!
    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2019-03-31
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多