2017-06-21 30 views
2

在熊貓我有一系列和多指標:通過重複一排新的多指標創建大熊貓據幀

s = pd.Series([1,2,3,4], index=['w', 'x', 'y', 'z']) 
idx = pd.MultiIndex.from_product([['a', 'b'], ['c', 'd']]) 

什麼是我創建具有IDX作爲指數數據框的最佳途徑, s作爲每行的值,將S中的索引保留爲列?

df = 
     w x y z 
a c 1 2 3 4 
    d 1 2 3 4 
b c 1 2 3 4 
    d 1 2 3 4 

回答

2

通過assign

pd.DataFrame(index=idx).assign(**s) 

    w x y z 
a c 1 2 3 4 
    d 1 2 3 4 
b c 1 2 3 4 
    d 1 2 3 4 
+0

這是一個非常聰明的解決方案! – Allen

+0

這是超級有趣的。我唯一要注意的是'assign'根據其索引來改變's'的順序(參見[documentation]中的Notes部分(http://pandas.pydata.org/pandas-docs/stable/generated/) pandas.DataFrame.assign.html#注))。因此,如果索引名稱是'['w','x','y','a']',列'a'會跳到最前面。但是這對我的目的來說沒問題。 – Zhang18

0

使用使用pd.DataFrame構造其次[秒] * LEN(多個)數據,IDX作爲索引和s.index作爲列來重構DF。

pd.DataFrame([s]*len(s),idx,s.index) 
Out[56]: 
    w x y z 
a c 1 2 3 4 
    d 1 2 3 4 
b c 1 2 3 4 
    d 1 2 3 4 
+1

這隻適用於巧合,因爲'len(s)== len(idx)'。嘗試's = pd.Series([0,1,2,3,4],index = ['v','w','x','y','z'])'並且失敗。你想要這個,而不是'pd.DataFrame([s] * len(idx),idx,s.index)' – piRSquared

0

您可以使用numpy.repeatnumpy.ndarray.reshape重複的數據和最後DataFrame構造:

arr = np.repeat(s.values, len(idx)).reshape(-1, len(idx)) 
df = pd.DataFrame(arr, index=idx, columns=s.index) 
print (df) 
    w x y z 
a c 1 1 1 1 
    d 2 2 2 2 
b c 3 3 3 3 
    d 4 4 4 4 

時序

np.random.seed(123) 
s = pd.Series(np.random.randint(10, size=1000)) 
s.index = s.index.astype(str) 
idx = pd.MultiIndex.from_product([np.random.randint(10, size=250), ['a','b','c', 'd']]) 

In [32]: %timeit (pd.DataFrame(np.repeat(s.values, len(idx)).reshape(len(idx), -1), index=idx, columns=s.index)) 
100 loops, best of 3: 3.94 ms per loop 

In [33]: %timeit (pd.DataFrame(index=idx).assign(**s)) 
1 loop, best of 3: 332 ms per loop 

In [34]: %timeit pd.DataFrame([s]*len(idx),idx,s.index) 
10 loops, best of 3: 82.9 ms per loop 
+0

謝謝!我對這個(和其他)這個問題的答案瞭解得很多,這個問題是在Pandas中速度和語法本地化之間存在權衡。我現在明白,如果我能更頻繁地使用numpy,我的速度會上升! – Zhang18

+0

雅,如果性能不重要,所有解決方案都不錯,好lukc! – jezrael