2017-09-07 51 views
0

我有以下的数据帧df如何GROUPBY和适用于大熊猫的功能

period remaining_et_months property_id beds 
0  0     0   329  1 
1  1     0   329  1 
2  2     1   329  1 
3  3     2   329  1 
4  3     2   329  1 
5  4     3   329  1 
6  4     3   329  1 
7  4     3   329  1 
8  5     4   329  1 
9  5     4   329  1 
10  5     4   329  1 
11  5     4   329  1 

,我需要组这个数据帧和应用功能,使我能够计算一列名为dist_period

g = df.groupby(['property_id', 'beds', 'period']) 
g.apply(some_function) 

我需要组由property_idbeds,和period,因为数据帧大于一个在本例中大。

我没有一个明确的想法如何实现这一点,但我想要的东西列dist_period是这样的:

period remaining_et_months dist_period 
0  0     0   0 
1  1     0   1 
2  2     1   1 
3  3     2   1 
4  3     2   2 
5  4     3   1 
6  4     3   2 
7  4     3   3 
8  5     4   1 
9  5     4   2 
10  5     4   3 
11  5     4   4 

注意,当该组只有一个元素的dist_periodperiod - remaining_et_months,但是当该组有多个元素时(见周期为3,4或5时),则执行从1开始的计数。

+0

您需要将问题简化为代表您拥有的数据并演示您想要执行的操作的等效代码。正如你的问题所在,我不知道你如何从第一张桌子到第二张桌子。 – piRSquared

+0

@piRSquared,我清楚我想要得到什么,但我不知道如何得到它。看你什么时候分组,每个组都会有一些元素。以榜样为例,将会有6个组。有3个组的元素个数为1,因此这些行的'dist_period'的值是'period - remaining_et_months'。其他三个组有不止一个元素,所以对于'period'等于3,我希望每个元素都从1开始计算。它有意义吗? – lmiguelvargasf

+0

remaining_et_months总是周期1吗? – user3212593

回答

1

获取多个行组计数的cumcount(编辑:注意,这从0开始计数):

df['dist_period'] = df.groupby(['property_id', 'beds', 'period']).cumcount() 

然后你只需要添加期和remaining_et_months之间的区别:

df['dist_period'] = df['period'] - df['remaining_et_months'] + df['dist_period'] 
+0

这是一个非常好的捕获,哇!你已经解决了我的问题。非常感谢。 – lmiguelvargasf

+0

如果'period'和'remaining_et_months'之间的差异大于1,那么该怎么办? – lmiguelvargasf

+1

这并不重要,因为你采取了df ['period'] - df ['remaining_et_months']。这个差别总是会被考虑在内的。 – user3212593