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,我的速度就会提高!是的,如果性能不重要,那么所有的解决方案都很好,很好!