2016-12-07 9 views
2

説明が難しい理由から、パンダのデータフレーム内のセルのブロックの平均値をランダムに設定したいと考えています。データフレームは常にsqrt(列数xインデックス数)の値を持ち、残りのすべてはNaNになります。値はほぼ均等に分布しているため、正しいサイズのセルのブロックを平均した場合、各ブロック内に1つの値があると予想されます。パンダのデータフレーム内のセルの平均ブロック

これは私の例です。 100列と100指標については、データフレーム全体にランダムに分布する100の値があります。私は、10x10ブロックあたり〜1の値があり、他はすべてNaNであることを期待しています。どのように私は、その中に10列、10の指標、および値(複数可)を平均化(1つのセルに各10×10ブロックを有効にすることができます

マイコード:?

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あなたは、4D配列の分割に再構築することができます第二及び第四の軸に沿った長さsqrt(len of each axis)と計算平均の二つの軸にそれぞれ軸NaNsnp.nanmeanと無視 -

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あなたは働いていない部分について詳しく説明できますか?そこにあるNaNや値の不一致?何も変更せずに作業している必要があります。 – Divakar

+0

ランタイム警告が表示され、「Mean of empty slice」と表示され、結果のデータフレームは変更されません。 – 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

関連する問題