2016-12-07 43 views
2

由于难以解释的原因,我想要平均使用随机值稀疏填充的熊猫数据框中的单元块。数据框将始终有sqrt(列数×索引数)值 - 其余全部为NaN。这些值大致是均匀分布的,所以如果我平均分配正确大小的单元格块,我希望在每个块内都有一个值。对熊猫数据框中的单元格进行平均处理

这是我的例子。对于100列和100个索引,我有100个值随机分布在整个数据框中。我预计每个10x10区块会有〜1个值,其他都是NaN。我怎样才能把各10×10块为一个单元格(内它平均的10列,10个指数,和值(S)

我的代码:?

import pandas as pd 
import numpy as np 
import math 

number_of_planes = 100 

thicknesses = np.empty(number_of_planes) 
cos_thetas = np.empty(number_of_planes) 
phis = np.empty(number_of_planes) 
for i in range(0,number_of_planes): 
    r = 1 
    phi = np.random.uniform(0,2*math.pi) 
    theta = math.acos(2*np.random.uniform(0.5,1) - 1) 
    thickness = np.random.uniform(0,0.4) 

    phis[i] = phi 
    cos_thetas[i] = math.cos(theta) 
    thicknesses[i] = thickness 

thick_df = pd.DataFrame(columns=phis, index=cos_thetas) 

for i in range(0, len(thicknesses)): 
    thick_df.set_value(cos_thetas[i], phis[i], thicknesses[i], takeable=False) 

thick_df = thick_df.sort_index(axis=0, ascending=False) 
thick_df = thick_df.sort_index(axis=1) 

回答

3

IIUC你可以重塑成一个四维阵列分裂每个轴为沿着第二和第四轴线忽略NaNsnp.nanmean长度sqrt(len of each axis)和计算平均的两个轴 -

arr = thick_df.values.astype(float) 
n = int(np.sqrt(number_of_planes)) 

out = np.nanmean(arr.reshape(n,n,n,n),axis=(1,3)) 

indx = thick_df.index.values.reshape(-1,n).mean(1) 
coln = thick_df.columns.values.reshape(-1,n).mean(1) 
df_out = pd.DataFrame(out, index=indx, columns= coln) 

样品运行 -

In [174]: thick_df # number_of_planes = 4 
Out[174]: 
      4.550477 5.138694 5.411510 6.123163 
0.981987  NaN  NaN 0.393233  NaN 
0.565861 0.186647  NaN  NaN  NaN 
0.193190  NaN  NaN  NaN 0.11626 
0.088382  NaN 0.166189  NaN  NaN 

In [175]: df_out 
Out[175]: 
      4.844586 5.767337 
0.773924 0.186647 0.393233 
0.140786 0.166189 0.116260 
+0

好吧,我想我明白,但是当我试图把它应用到我的代码没有奏效。我需要更改哪部分以便为我的100x100数据帧进行这项工作? – Arnold

+0

@Rebecca你能否详细说明没有工作的部分?那里的NaNs或价值不匹配?应该没有任何变化的工作。 – Divakar

+0

我得到运行时警告说“空片的平均值”和结果数据帧看起来没有变化。 – Arnold

3
m, n = 10, 10 
row_groups = np.arange(len(thick_df.index)) // m 
col_groups = np.arange(len(thick_df.columns)) // n 

grpd = pd.DataFrame(thick_df.values, row_groups, col_groups) 

val = pd.to_numeric(grpd.stack(), 'coerce').groupby(level=[0, 1]).mean().unstack().values 
idx = thick_df.index.to_series().groupby(row_groups).mean().values 
col = thick_df.columns.to_series().groupby(col_groups).mean().values 

pd.DataFrame(val, idx, col) 

enter image description here

+0

与上述解决方案相同的问题 - 我需要列和索引标签作为其先前值的平均值! – Arnold

+0

@Rebecca我已更新我的帖子 – piRSquared

+0

完美,谢谢! – Arnold