有许多的可能性,各地np.repeat
建:
def using_reindex(df):
return df.reindex(np.repeat(df.index, df['A'])).reset_index(drop=True)
def using_dictcomp(df):
return pd.DataFrame({col:np.repeat(df[col].values, df['A'], axis=0)
for col in df})
def using_df_values(df):
return pd.DataFrame(np.repeat(df.values, df['A'], axis=0), columns=df.columns)
def using_loc(df):
return df.loc[np.repeat(df.index.values, df['A'])].reset_index(drop=True)
例如,
In [219]: df = pd.DataFrame({"A":[1, 2, 3], "B":[3,4,5]})
In [220]: df.reindex(np.repeat(df.index, df['A'])).reset_index(drop=True)
Out[220]:
A B
0 1 3
1 2 4
2 2 4
3 3 5
4 3 5
5 3 5
这里是一个1000行 数据帧的基准;其结果是一个大约500K行数据帧:
In [208]: df = make_dataframe(1000)
In [210]: %timeit using_dictcomp(df)
10 loops, best of 3: 23.6 ms per loop
In [218]: %timeit using_reindex(df)
10 loops, best of 3: 35.8 ms per loop
In [211]: %timeit using_df_values(df)
10 loops, best of 3: 31.3 ms per loop
In [212]: %timeit using_loc(df)
1 loop, best of 3: 275 ms per loop
这是我用来生成df
代码:
import numpy as np
import pandas as pd
def make_dataframe(nrows=100):
df = pd.DataFrame(
{'A': np.arange(nrows),
'float': np.random.randn(nrows),
'str': np.random.choice('Lorem ipsum dolor sit'.split(), size=nrows),
'datetime64': pd.date_range('20000101', periods=nrows)},
index=pd.date_range('20000101', periods=nrows))
return df
df = make_dataframe(1000)
如果只有几列,using_dictcomp
是最快的。但是请注意,using_dictcomp
假定df
具有唯一的列名称。 using_dictcomp
中的字典理解不会重复列名。但是,其他替代方法将与重复的列名称一起使用。
using_reindex
和using_loc
假定df
有一个唯一的索引。
using_reindex
从cᴏʟᴅsᴘᴇᴇᴅ的using_loc
来了,在(不幸)现在 删除帖子。 cᴏʟᴅsᴘᴇᴇᴅ显示没有必要手动重复所有值 - 您只需重复索引,然后让df.loc
(或df.reindex
)为您重复所有行。它还避免访问df.values
,如果df
包含多个dtype列,则可以生成object
dtype的中间NumPy数组。
我出于好奇而做了一个基准测试,你的第一个解决方案比我的速度快10倍。我知道什么时候我超越了;) –