Pandas 通过使用新的多索引重复一行来创建数据帧

Pandas 通过使用新的多索引重复一行来创建数据帧,pandas,dataframe,creation,Pandas,Dataframe,Creation,在熊猫中,我有一个系列和一个多索引: 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

在熊猫中,我有一个系列和一个多索引:

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

使用
pd.DataFrame
构造函数,后跟
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
使用[s]*len(s)作为数据,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
对于重复数据和最后一个
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

这是一个非常聪明的解决方案!这太有趣了。我唯一要注意的是,
assign
根据索引对
s
的顺序进行无序排列(请参见中的注释部分)。因此,如果索引名是
['w','x','y','a']
,那么
a列将跳到前面。但这对我来说没关系。这只是巧合,因为
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)
谢谢!我从你对这个(和其他)问题的回答中学到了很多,在熊猫的内部,速度和语法本地化之间存在着一种权衡。我现在明白了,如果我能更多地求助于numpy,我的速度就会提高!是的,如果性能不重要,那么所有的解决方案都很好,很好!