あり、すべてのnp.repeat
を中心に構築された可能性の数、されています、ここで
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行 データフレームのベンチマーク例えば
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)
です;これは私がdf
を生成するために使用されるコードである
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
:結果は、おおよそ500K行データフレームである
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
に複数のdtypeの列が含まれている場合は、df.values
にアクセスして、object
dtypeの中間NumPy配列を生成することも回避します。
私は好奇心からベンチマークを行い、最初のソリューションは私の10倍の速さです。私がoutclassed時を知っている;) –