在Python数据帧中循环遍历groupby

时间:2017-07-09 22:33:28

标签: python pandas

我是python的新手。我试图在python数据帧上编写代码来循环数据。以下是我的初始数据:

A   B   C   Start Date  End Date
1   2   5   01/01/15    1/31/15
1   2   4   02/01/15    2/28/15
1   2   7   02/25/15    3/15/15
1   2   9   03/11/15    3/30/15
1   2   8   03/14/15    4/5/15
1   2   3   03/31/15    4/10/15
1   2   4   04/05/15    4/27/15
1   2   11  04/15/15    4/20/15
4   5   23  5/6/16      6/6/16
4   5   12  6/10/16     7/10/16

我想创建一个新列作为forward_c。 Forward_C是满足条件的那一行的数据:

  1. A栏和B栏应该相等。
  2. 行的Start_Date应大于当前行的开始日期和结束日期。
  3. 预期输出为:

    A   B   C   Start Date  End Date    Forward_C
    1   2   5   01/01/15    1/31/15        4
    1   2   4   02/01/15    2/28/15        9
    1   2   7   02/25/15    3/15/15        3
    1   2   9   03/11/15    3/30/15        3
    1   2   8   03/14/15    4/5/15         11
    1   2   3   03/31/15    4/10/15        11
    1   2   4   04/05/15    4/27/15         0
    1   2   11  04/15/15    4/20/15         0
    4   5   23  5/6/16      6/6/16         12
    4   5   12  6/10/16     7/10/16         0
    

    我在下面写了代码来实现同样的目标:

    df = data.groupby(['A','B'], as_index = False).apply(lambda x: 
    x.sort_values(['Start Date','End Date'],ascending = True))
    
    for i,j in df.iterrows():
    
        for index,row in df.iterrows():
    
            if (j['A'] == row['A']) and (j['B'] == row['B']) and (row['Start Date'] > j['End Date']) and (j['Start Date'] < row['Start Date']):
    
                j['Forward_C'] = row['C']
    
                df.loc[i,'Forward_C'] = row['C']
    
                break
    

    我想知道是否有更有效的方法在python中做同样的事情。 因为现在我的代码将遍历每条记录的所有行。这会降低性能,因为它将处理超过1000万条记录。

    感谢您的意见。 提前谢谢。

    此致 RD

1 个答案:

答案 0 :(得分:0)

我对这个问题并不十分清楚。根据我的理解,这是我能想到的。我使用交叉连接而不是循环。

import pandas
data = #Actual Data Frame
data['Join'] = "CrossJoinColumn"
df1 = pandas.merge(data,data,how = "left",on = "Join",suffixes = ["","_2"])
df1 = df1[(df1['A'] == df1['A_2']) & (df1['B'] == df1['B_2']) & (df1['Start Date'] < df1['Start Date_2']) & (df1['End Date'] < df1['Start Date_2'])].groupby(by =['A','B','C','Start Date','End Date']).first().reset_index()[['A','B','C','Start Date','End Date','C_2']]
df1 = pandas.merge(data,df1,how = "left",on = ['A','B','C','Start Date','End Date'])