繁体   English   中英

应用自定义 groupby 聚合 function 来查找 Numpy 数组的平均值

[英]Applying a custom groupby aggregate function to find average of Numpy Array

我有一个 pandas DataFrame,其中 B 包含固定大小的 NumPy 列表。

|------|---------------|-------|
|  A   |       B       |   C   |
|------|---------------|-------|
|  0   |   [2,3,5,6]   |   X   |
|------|---------------|-------|
|  1   |   [1,2,3,4]   |   X   |
|------|---------------|-------|
|  2   |   [2,3,6,5]   |   Y   |
|------|---------------|-------|
|  3   |   [2,3,2,3]   |   Y   |
|------|---------------|-------|
|  4   |   [2,3,4,4]   |   Y   |
|------|---------------|-------|
|  5   |   [2,3,5,6]   |   Z   |
|------|---------------|-------|

我想按“C”列对这些进行分组,并计算“B”值的平均值作为列表。 如下表所示。 我想有效地做到这一点。

|----------------|-------|
|        B       |   C   |
|----------------|-------|
|  [1.5,2.5,4,5] |   X   |
|----------------|-------|
|    [2,3,4,4]   |   Y   |
|----------------|-------|
|    [2,3,5,6]   |   Z   |
|----------------|-------|

我考虑过将 NumPy 列表分成单独的列。 但那将是我最后的选择。

如何编写自定义聚合 function,因为现在 B 列显示非数字并显示

DataError: No numeric types to aggregate 

将值转换为二维数组然后使用np.mean您的需求:

f = lambda x: np.mean(np.array(x.tolist()), axis=0)
df2 = df.groupby('C')['B'].apply(f).reset_index()
print (df2)
   C                     B
0  X  [1.5, 2.5, 4.0, 5.0]
1  Y  [2.0, 3.0, 4.0, 4.0]
2  Z  [2.0, 3.0, 5.0, 6.0]

最后一个选项解决方案是可能的,但效率较低(感谢@Abhik Sarkar 进行测试):

df1 = pd.DataFrame(df.B.tolist()).groupby(df['C']).mean()
df2 = pd.DataFrame({'B': df1.values.tolist(), 'C': df1.index})
print (df2)
                      B  C
0  [1.5, 2.5, 4.0, 5.0]  X
1  [2.0, 3.0, 4.0, 4.0]  Y
2  [2.0, 3.0, 5.0, 6.0]  Z

虚拟数据

size,list_size = 10,5
data = [{'C':random.randint(95,100), 
         'B':[random.randint(0,10) for i in range(list_size)]} for j in range(size)]
df = pd.DataFrame(data)

使用 numpy 的自定义聚合

unique_C = df.C.unique()
data_calculated  = []
axis = 0

for c in unique_C:
    arr = np.reshape(np.hstack(df[df.C==c]['B']),(-1,list_size))
    mean, std = arr.mean(axis=axis), arr.std(axis=axis)  # other aggergation can also be added
    data_calculated.append(dict(C=t,B_mean=mean, B_std=std))
new_df = pd.DataFrame(data_calculated)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM