这是我的df。
index firmcode year indcode ROA
0 a 2006 03 0.1
1 b 2006 03 0.2
2 c 2006 03 0.4
3 d 2006 03 0.7
4 e 2006 07 0.3
5 f 2006 07 0.8
6 g 2006 07 1.1
7 h 2006 07 2.1
我希望它是如下(除了同一家公司(。这是ROA匹配最近的公司(在同一年,相同的indcode(
index firmcode year indcode ROA diff_min_firmcode
0 a 2006 03 0.1 b
1 b 2006 03 0.2 a
2 c 2006 03 0.4 b
3 d 2006 03 0.7 c
4 e 2006 07 0.3 f
5 f 2006 07 0.8 g
6 g 2006 07 1.1 f
7 h 2006 07 2.1 g
如何获取df['diff_min_firmcode']
列?
一个想法是使用自定义函数来减去每个组的每个值ROA
,将NaN
s设置为对角线以省略同一个公司,然后使用DataFrame.idxmin
:
def f(x):
y = x['ROA'].to_numpy()
arr = np.abs(y - y[:, None])
np.fill_diagonal(arr, np.nan)
z = pd.DataFrame(arr, index=x['firmcode'], columns=x.index)
return z.idxmin()
df['diff_min_firmcode'] = df.groupby(['year','indcode'], group_keys=False).apply(f)
print (df)
firmcode year indcode ROA diff_min_firmcode
0 a 2006 3 0.1 b
1 b 2006 3 0.2 a
2 c 2006 3 0.4 b
3 d 2006 3 0.7 c
4 e 2006 7 0.3 f
5 f 2006 7 0.8 g
6 g 2006 7 1.1 f
7 h 2006 7 2.1 g