我的熊猫数据框如下所示:
Person ID ZipCode Gender
0 12345 882 38182 Female
1 32917 271 88172 Male
2 18273 552 90291 Female
我想复制每一行 3 次重置索引得到:
Person ID ZipCode Gender
0 12345 882 38182 Female
1 12345 882 38182 Female
2 12345 882 38182 Female
3 32917 271 88172 Male
4 32917 271 88172 Male
5 32917 271 88172 Male
6 18273 552 90291 Female
7 18273 552 90291 Female
8 18273 552 90291 Female
我尝试了以下解决方案:
pd.concat([df[:5]]*3, ignore_index=True)
和:
df.reindex(np.repeat(df.index.values, df['ID']), method='ffill')
但他们都没有工作。
原文由 DasVisual 发布,翻译遵循 CC BY-SA 4.0 许可协议
解决方案:
使用
np.repeat
:版本 1:
尝试使用
np.repeat
:上面的代码会输出:
np.repeat
重复值df
,3
次。然后我们通过分配
new_df.columns = df.columns
添加列。版本 2:
您还可以在第一行分配列名,如下所示:
上面的代码也会输出:
版本 3:
您可以使用
loc
缩短它,并且只重复索引,如下所示:上面的代码也会输出:
我使用
reset_index
将索引替换为单调索引 (0, 1, 2, 3, 4...
)。没有
np.repeat
:版本 4:
您可以使用内置的
pd.DataFrame.index.repeat
函数,如下所示:上面的代码也会输出:
记得添加
reset_index
来排列index
。版本 5:
或者通过使用
concat
和sort_index
,如下所示:上面的代码也会输出:
版本 6:
您还可以将
loc
与 Pythonlist
乘法和sorted
一起使用,如下所示:上面的代码也会输出:
计时:
用以下代码计时:
输出:
我们可以看到版本 2 和版本 3 比其他版本快,这是因为它们都使用
np.repeat
函数,而numpy
函数非常快,因为它们是用C。由于使用
loc
而不是DataFrame
,版本 3 略胜于版本 2。Version 5 is significantly slower because of the functions
concat
andsort_index
, sinceconcat
copiesDataFrame
s quadratically, which takes longer time.最快的版本:版本 3。