2017-06-21 29 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