2012-07-04 25 views
3

我知道我可以通過以下操作適用numpy的方法:分組熊貓DataFrames:我如何將scipy.stats.sem應用於它們?

dataListDataFrame S(相同的cols /行)的列表。

testDF = (concat(dataList, axis=1, keys=range(len(dataList))) 
     .swaplevel(0, 1, axis=1) 
     .sortlevel(axis=1) 
     .groupby(level=0, axis=1)) 

testDF.aggregate(numpy.mean) 
testDF.aggregate(numpy.var) 

等等。但是,如果我想計算平均值的標準誤差(sem)呢?

我想:

testDF.aggregate(scipy.stats.sem) 

,但它給了一個令人困惑的錯誤。有人知道怎麼做嗎?什麼是scipy.stats方法做不同?

下面是一些代碼,再現錯誤對我來說:

from scipy import stats as st 
import pandas 
import numpy as np 
df_list = [] 
for ii in range(30): 
    df_list.append(pandas.DataFrame(np.random.rand(600, 10), 
    columns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])) 

testDF = (pandas.concat(df_list, axis=1, keys=range(len(df_list))) 
     .swaplevel(0, 1, axis=1) 
     .sortlevel(axis=1) 
     .groupby(level=0, axis=1)) 

testDF.aggregate(st.sem) 

這裏的錯誤消息:

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-1-184cee8fb2ce> in <module>() 
    12   .groupby(level=0, axis=1)) 
    13 
---> 14 testDF.aggregate(st.sem) 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/core/groupby.py in aggregate(self, arg, *args, **kwargs) 
    1177     return self._python_agg_general(arg, *args, **kwargs) 
    1178    else: 
-> 1179     result = self._aggregate_generic(arg, *args, **kwargs) 
    1180 
    1181   if not self.as_index: 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/core/groupby.py in _aggregate_generic(self, func, *args, **kwargs) 
    1248    else: 
    1249     result = DataFrame(result, index=obj.index, 
-> 1250         columns=result_index) 
    1251   else: 
    1252    result = DataFrame(result) 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy) 
    300    mgr = self._init_mgr(data, index, columns, dtype=dtype, copy=copy) 
    301   elif isinstance(data, dict): 
--> 302    mgr = self._init_dict(data, index, columns, dtype=dtype) 
    303   elif isinstance(data, ma.MaskedArray): 
    304    mask = ma.getmaskarray(data) 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/core/frame.py in _init_dict(self, data, index, columns, dtype) 
    389 
    390   # consolidate for now 
--> 391   mgr = BlockManager(blocks, axes) 
    392   return mgr.consolidate() 
    393 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/core/internals.py in __init__(self, blocks, axes, do_integrity_check) 
    329 
    330   if do_integrity_check: 
--> 331    self._verify_integrity() 
    332 
    333  def __nonzero__(self): 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/core/internals.py in _verify_integrity(self) 
    404   mgr_shape = self.shape 
    405   for block in self.blocks: 
--> 406    assert(block.values.shape[1:] == mgr_shape[1:]) 
    407   tot_items = sum(len(x.items) for x in self.blocks) 
    408   assert(len(self.items) == tot_items) 

AssertionError: 
+0

您是否可以複製並粘貼實際的錯誤消息,或者更好的重現錯誤的小代碼示例?當我嘗試它時它爲我工作。 – DSM

+0

@DSM:我將錯誤消息添加到了我原來的問題中。請注意,我可以在沒有問題的情況下在這個完全相同的DataFrame上執行numpy方法。 –

+0

我現在可以重現錯誤,所以讓我們看看..可能我的測試數據框太簡單了。 – DSM

回答

3

更新答:

看來,我可以使用複製這個我的各種圖書館的工作版本。稍後我會檢查我的家庭版本,看看這些功能的文檔是否有所不同。

與此同時,下面的工作我用你的確切編輯後的版本爲:

In [35]: testDF.aggregate(lambda x: st.sem(x, axis=None)) 
Out[35]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 600 entries, 0 to 599 
Data columns: 
A 600 non-null values 
B 600 non-null values 
C 600 non-null values 
D 600 non-null values 
E 600 non-null values 
F 600 non-null values 
G 600 non-null values 
H 600 non-null values 
I 600 non-null values 
J 600 non-null values 
dtypes: float64(10) 

這讓我懷疑它與sem()軸約定的事情。它默認爲0,並且最終映射到的Pandas對象可能有奇怪的第0軸或其他東西。當我使用選項axis=None時,它拋棄了它應用到的對象,這使它工作。

正如一個全面的檢查,我這樣做,它的工作太:

In [37]: testDF.aggregate(lambda x: st.sem(x, axis=1)) 
Out[37]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 600 entries, 0 to 599 
Data columns: 
A 600 non-null values 
B 600 non-null values 
C 600 non-null values 
D 600 non-null values 
E 600 non-null values 
F 600 non-null values 
G 600 non-null values 
H 600 non-null values 
I 600 non-null values 
J 600 non-null values 
dtypes: float64(10) 

但你應該檢查,以確保這其實是SEM重視你想要的,可能對一些規模較小的示例數據。

較舊的回答: 這可能與模塊問題與scipy.stats?當我使用這個模塊時,我不得不稱之爲from scipy import stats as st或類似的東西。 import scipy.stats不起作用,並調用import scipy; scipy.stats.sem給出一個錯誤,指出沒有名爲「stats」的模塊存在。

熊貓似乎根本不會找到該功能。我認爲應該改進錯誤信息,因爲這不明顯。

>>> from scipy import stats as st 
>>> import pandas 
>>> import numpy as np 
>>> df_list = [] 
>>> for ii in range(10): 
...  df_list.append(pandas.DataFrame(np.random.rand(10,3), 
...  columns = ['A', 'B', 'C'])) 
... 
>>> df_list 
# Suppressed the output cause it was big. 

>>> testDF = (pandas.concat(df_list, axis=1, keys=range(len(df_list))) 
...  .swaplevel(0, 1, axis=1) 
...  .sortlevel(axis=1) 
...  .groupby(level=0, axis=1)) 
>>> testDF 
<pandas.core.groupby.DataFrameGroupBy object at 0x38524d0> 
>>> testDF.aggregate(np.mean) 
key_0   A   B   C 
0  0.660324 0.408377 0.374681 
1  0.459768 0.345093 0.432542 
2  0.498985 0.443794 0.524327 
3  0.605572 0.563768 0.558702 
4  0.561849 0.488395 0.592399 
5  0.466505 0.433560 0.408804 
6  0.561591 0.630218 0.543970 
7  0.423443 0.413819 0.486188 
8  0.514279 0.479214 0.534309 
9  0.479820 0.506666 0.449543 
>>> testDF.aggregate(np.var) 
key_0   A   B   C 
0  0.093908 0.095746 0.055405 
1  0.075834 0.077010 0.053406 
2  0.094680 0.092272 0.095552 
3  0.105740 0.126101 0.099316 
4  0.087073 0.087461 0.111522 
5  0.105696 0.110915 0.096959 
6  0.082860 0.026521 0.075242 
7  0.100512 0.051899 0.060778 
8  0.105198 0.100027 0.097651 
9  0.082184 0.060460 0.121344 
>>> testDF.aggregate(st.sem) 
      A   B   C 
0 0.089278 0.087590 0.095891 
1 0.088552 0.081365 0.098071 
2 0.087968 0.116361 0.076837 
3 0.110369 0.087563 0.096460 
4 0.101328 0.111676 0.046567 
5 0.085044 0.099631 0.091284 
6 0.113337 0.076880 0.097620 
7 0.087243 0.087664 0.118925 
8 0.080569 0.068447 0.106481 
9 0.110658 0.071082 0.084928 

似乎爲我工作。

+0

我開始懷疑我是否安裝了不合適的東西。我用我的代碼版本編輯了我的原始問題,它爲我重現了錯誤(並且更具代表性的是我的數據集)。 –

+0

代碼中的第一個AssertionError表明您沒有運行您發佈的已編輯版本。它窒息了,'79 test = testDF.aggregate(sp.stats.sem)',看起來像你的舊問題......只需導入SciPy,然後嘗試使用scipy.stats.sem,這將不起作用。你能弄清楚爲什麼它向我們展示了代碼'test = testDF.aggregate(sp.stats.sem)'而不是新編輯的版本,而不涉及以這種方式導入SciPy的錯誤?我懷疑你運行的是你的編輯版本或錯誤的版本。 – ely

+0

我是。我沒有更新錯誤;它現在更新了。 –