没有循环的数据集的特定组

时间:2019-08-08 11:09:55

标签: python pandas numpy

我有一个包含Id,Week和Money列的数据集。

Id Week Money 
1  1    18  
2  1    19
3  1    21
4  1    25
1  2    27 
3  2    29 
2  2    40

我想在一个星期内将ine ID与另一个ID进行比较。所以在输出中,我想要得到这样的东西:

Id1 Id2 Week Money1 Money2 
1    2    1    18   19
1    3    1    18   21
1    4    1    18   25 
2    1    1    19   18
2    3    1    19   21
2    4    1    19   25
.....
3    1    2    29   27
3    2    2    29   40

在那之后,我想得到每个小组并进行一些操作。例如,我想参加第一组

Id1 Id2 Week Money1 Money2 
1    2    1    18   19
1    3    1    18   21
1    4    1    18   25 

并传递到some_func()列“ Money1”,“ Money2”。 我可以使用for循环和df.loc来做到这一点,但是我拥有的数据量非常大,因此需要很多时间。我可以更快吗?

1 个答案:

答案 0 :(得分:1)

通过Week列与DataFrame.merge进行交叉联接,然后更改list的列顺序:

df = df.merge(df, on='Week', suffixes=('1','2'))[['Id1','Id2','Week','Money1','Money2']]
print (df)
    Id1  Id2  Week  Money1  Money2
0     1    1     1      18      18
1     1    2     1      18      19
2     1    3     1      18      21
3     1    4     1      18      25
4     2    1     1      19      18
5     2    2     1      19      19
6     2    3     1      19      21
7     2    4     1      19      25
8     3    1     1      21      18
9     3    2     1      21      19
10    3    3     1      21      21
11    3    4     1      21      25
12    4    1     1      25      18
13    4    2     1      25      19
14    4    3     1      25      21
15    4    4     1      25      25
16    1    1     2      27      27
17    1    3     2      27      29
18    1    2     2      27      40
19    3    1     2      29      27
20    3    3     2      29      29
21    3    2     2      29      40
22    2    1     2      40      27
23    2    3     2      40      29
24    2    2     2      40      40

然后使用GroupBy.apply

def func(x):
    print (x)
    #e.g. some custom function
    x['new'] = (x['Id1'] > x['Id2']).sum()
    return x

df = df.groupby(['Id1','Week','Money1']).apply(func)