2

我有一個相當大的數據幀(DF)包含陣列和楠每個網孔多陣列的元素方面的標準偏差,第3行是這樣的:的Python:如何讓一個數據幀

df: 
       A    B    C 
X [4, 8, 1, 1, 9]    NaN [8, 2, 8, 4, 9] 
Y [4, 3, 4, 1, 5] [1, 2, 6, 2, 7] [7, 1, 1, 7, 8] 
Z    NaN [9, 3, 8, 7, 7] [2, 6, 3, 1, 9] 

我已經知道(thanks to piRSquared)如何採取逐元素意味着在行的每一列,讓我得到這個:

element_wise_mean: 
A      [4.0, 5.5, 2.5, 1.0, 7.0] 
B      [5.0, 2.5, 7.0, 4.5, 7.0] 
C [5.66666666667, 3.0, 4.0, 4.0, 8.66666666667] 

現在我不知道如何來獲取各自的標準偏差,任何想法?另外,我還不明白groupby()在做什麼,有人可以更詳細地解釋它的功能嗎?


DF

np.random.seed([3,14159]) 
df = pd.DataFrame(
    np.random.randint(10, size=(3, 3, 5)).tolist(), 
    list('XYZ'), list('ABC') 
).applymap(np.array) 

df.loc['X', 'B'] = np.nan 
df.loc['Z', 'A'] = np.nan 

element_wise_mean

df2    = df.stack().groupby(level=1) 
element_wise_mean = df2.apply(np.mean, axis=0) 

element_wise_sd

element_wise_sd = df2.apply(np.std, axis=0) 
TypeError: setting an array element with a sequence. 
+1

嘗試在numpy的數組值 - 'df2.apply(拉姆達X:NP。 STD(x.values))'? – Zero

+0

我知道有人會很高興看到你的種子價值。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ是否是pirsquared? – Dark

回答

3

應用np.std使用lambda與轉換爲numpy array爲我工作:

element_wise_std = df2.apply(lambda x: np.std(np.array(x), 0)) 
#axis=0 is by default, so can be omit 
#element_wise_std = df2.apply(lambda x: np.std(np.array(x))) 
print (element_wise_std) 
A       [0.0, 2.5, 1.5, 0.0, 2.0] 
B       [4.0, 0.5, 1.0, 2.5, 0.0] 
C [2.62466929134, 2.16024689947, 2.94392028878, ... 
dtype: object 

或解決方案從comment

element_wise_std = df2.apply(lambda x: np.std(x.values, 0)) 
print (element_wise_std) 
A       [0.0, 2.5, 1.5, 0.0, 2.0] 
B       [4.0, 0.5, 1.0, 2.5, 0.0] 
C [2.62466929134, 2.16024689947, 2.94392028878, ... 
dtype: object 

我試着更多地解釋:由stack

首先重塑 - 將列添加到index,並創建Multiindex。 (由值ABC)和apply一些功能 -

print (df.stack()) 
X A [4, 8, 1, 1, 9] 
    C [8, 2, 8, 4, 9] 
Y A [4, 3, 4, 1, 5] 
    B [1, 2, 6, 2, 7] 
    C [7, 1, 1, 7, 8] 
Z B [9, 3, 8, 7, 7] 
    C [2, 6, 3, 1, 9] 
dtype: object 

groupby(level=1)然後通過第一電平的裝置Multiindex組。這裏是np.std

熊貓不與array s一起使用或列出很好,所以轉換是必要的。 (它看起來像臭蟲)

+1

pandas列是一個序列,在這種情況下,每個序列都是一個數組。看起來熊貓的實現對於使用這個序列的數組並不好。通過執行'x.values'或'np.array(x)',該列被顯式轉換爲二維數組,因此之後就可以工作。奇怪它適用於'mean'而不是'std' - 可能會引發熊貓github上的問題,看看還有什麼可能發生 –

+0

@KenSyme - 好主意 - 我發佈它[這裏](https:// github。 COM /大熊貓-dev /目錄大熊貓/問題/ 17571)。 – jezrael

+0

非常感謝!對我而言,np.mean nd np.std在同一個數據集上的行爲應該是不同的,但它確實是這樣工作的。一旦你聽到爲什麼它是這樣的,很想再次聽到你的消息。 –

2

Jezrael打我這個:

要回答你的問題有關.groupby(),嘗試.apply(print)。你會看到什麼是返回,並在apply功能所做的使用:

df2 = df.stack().groupby(axis=1) #groups by the second index of df.stack() 
df2.apply(print) 
X A [4, 8, 1, 1, 9] 
Y A [4, 3, 4, 1, 5] 
Name: A, dtype: object 
Y B [1, 2, 6, 2, 7] 
Z B [9, 3, 8, 7, 7] 
Name: B, dtype: object 
X C [8, 2, 8, 4, 9] 
Y C [7, 1, 1, 7, 8] 
Z C [2, 6, 3, 1, 9] 
Name: C, dtype: object 

相反,嘗試:

df3 = df.stack().groupby(level=0) #this will group by the first index of df.stack() 
df3.apply(print) 
X A [4, 8, 1, 1, 9] 
    C [8, 2, 8, 4, 9] 
Name: X, dtype: object 
Y A [4, 3, 4, 1, 5] 
    B [1, 2, 6, 2, 7] 
    C [7, 1, 1, 7, 8] 
Name: Y, dtype: object 
Z B [9, 3, 8, 7, 7] 
    C [2, 6, 3, 1, 9] 
Name: Z, dtype: object 
+0

。應用程序(打印)正是我想要看到發生了什麼,感謝一堆! –

相關問題