[英]Getting NaN values when normalizing group in dataframe using GroupBy
[英]GroupBy operation using an entire dataframe to group values
我有2个像这样的数据帧......
np.random.seed(0)
a = pd.DataFrame(np.random.randn(20,3))
b = pd.DataFrame(np.random.randint(1,5,size=(20,3)))
我想找到值的平均值a
对4组b
。
这个...
a[b==1].sum().sum() / a[b==1].count().sum()
...适用于一次做一组,但我想知道是否有人能想到更清洁的方法。
我的预期结果是
1 -0.088715
2 -0.340043
3 -0.045596
4 0.582136
dtype: float64
谢谢。
你可以stack
然后groupby
两个Series
a.stack().groupby(b.stack()).mean()
如果你想要一个快速的numpy解决方案,请使用np.unique
和np.bincount
:
c, d = (a_.to_numpy().ravel() for a_ in [a, b])
u, i, cnt = np.unique(d, return_inverse=True, return_counts=True)
np.bincount(i, c) / cnt
# array([-0.0887145 , -0.34004319, -0.04559595, 0.58213553])
要构建系列,请使用
pd.Series(np.bincount(i, c) / cnt, index=u)
1 -0.088715
2 -0.340043
3 -0.045596
4 0.582136
dtype: float64
为了比较, stack
返回,
a.stack().groupby(b.stack()).mean()
1 -0.088715
2 -0.340043
3 -0.045596
4 0.582136
dtype: float64
%timeit a.stack().groupby(b.stack()).mean()
%%timeit
c, d = (a_.to_numpy().ravel() for a_ in [a, b])
u, i, cnt = np.unique(d, return_inverse=True, return_counts=True)
np.bincount(i, c) / cnt
5.16 ms ± 305 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
113 µs ± 1.92 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.