我有一个包含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来做到这一点,但是我拥有的数据量非常大,因此需要很多时间。我可以更快吗?

最佳答案

DataFrame.merge列中对Week使用交叉连接,然后更改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)

关于python - 没有循环的数据集的特定组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57411208/

10-13 07:22