我有一个包含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/