函数中的for循环和合并多个串联输出时出现问题

时间:2018-07-18 21:11:24

标签: python pandas for-loop

我是python的新手,正在努力寻找一些东西。我正在对熊猫发票数据库进行一些数据分析,其中列有金额,贷项,日期以及每个购买的包裹的唯一公司ID的列。

我想通过一个函数来运行每个唯一的公司ID,该函数将根据包裹购买日期的差额计算这些信用的平均花费率。我已经在函数中找到了基础知识,它返回了一个索引到原始数据帧的序列,其中包含每个软件包之间每天花费的平均信用额的值。但是,我一次只能使它与一个公司ID一起使用,而且我不知道我可以采取哪种方法将每个公司ID的所有这些不同系列组合在一起,以便能够在我的数据框中正确添加新列每个套件的平均信用支出价值。到目前为止,这是我的代码:

def creditspend(mylist = []):
    for i in mylist:        
        a = df.loc[df['CompanyId'] == i]
        a = a.sort_values(by=['Date'], ascending=False)
        days = a.Date.diff().map(lambda x: abs(x.days))
        spend = a['Credits']/days        
    print(spend)

如果我打电话

creditspend(mylist=[8, 15]) 

(具有多个输入)显然不起作用。我需要做什么才能完成此功能?

谢谢。

2 个答案:

答案 0 :(得分:0)

apply()在熊猫中是一种非常有用的方法,可将函数应用于DataFrame的每一行或每一列。

因此,如果您的DataFrame为df

def creditspend(row):
    # some calculation code here
    return spend

df['spend_rate'] = df.apply(creditspend)

(您还可以在带有axis = 1关键字的列上使用apply()。)

答案 1 :(得分:0)

为{em> CompanyID 聚合考虑一个groupby。下面以随机数据进行演示:

import numpy as np
import pandas as pd

np.random.seed(7182018)
df = pd.DataFrame({'CompanyID': np.random.choice(['julia', 'pandas', 'r', 'sas', 'stata', 'spss'],50),
                   'Date': np.random.choice(pd.Series(pd.date_range('2018-01-01', freq='D', periods=180)), 50),
                   'Credits': np.random.uniform(0,1000,50)
                  }, columns=['Date', 'CompanyID', 'Credits'])

# SORT ONCE OUTSIDE OF PROCESSING
df = df.sort_values(by=['CompanyID', 'Date'], ascending=[True, False]).reset_index(drop=True)

def creditspend(g):          
    g['days'] = g.Date.diff().map(lambda x: abs(x.days))
    g['spend'] = g['Credits']/g['days']

    return g

grp_df = df.groupby('CompanyID').apply(creditspend)

输出

print(grp_df.head(20))

#          Date CompanyID     Credits  days       spend
# 0  2018-06-20     julia  280.522287   NaN         NaN
# 1  2018-06-12     julia  985.009523   8.0  123.126190
# 2  2018-05-17     julia  892.308179  26.0   34.319545
# 3  2018-05-03     julia   97.410360  14.0    6.957883
# 4  2018-03-26     julia  480.206077  38.0   12.637002
# 5  2018-03-07     julia   78.892365  19.0    4.152230
# 6  2018-03-03     julia  878.671506   4.0  219.667877
# 7  2018-02-25     julia  905.172807   6.0  150.862135
# 8  2018-02-19     julia  970.016418   6.0  161.669403
# 9  2018-02-03     julia  669.073067  16.0   41.817067
# 10 2018-01-23     julia  636.926865  11.0   57.902442
# 11 2018-01-11     julia  790.107486  12.0   65.842291
# 12 2018-06-16    pandas  639.180696   NaN         NaN
# 13 2018-05-21    pandas  565.432415  26.0   21.747401
# 14 2018-04-22    pandas  145.232115  29.0    5.008004
# 15 2018-04-13    pandas  379.964557   9.0   42.218284
# 16 2018-04-12    pandas  538.168690   1.0  538.168690
# 17 2018-03-20    pandas  783.572993  23.0   34.068391
# 18 2018-03-14    pandas  618.354489   6.0  103.059081
# 19 2018-02-10    pandas  859.278127  32.0   26.852441