2017-07-28 6 views
2

Stataには、特定の列の値に対応するデータベースに行を追加する関数expandがあります。例えば:Pandas:列内の観測数でDataFrameを拡張

私が持っている:私は必要なもの

df = pd.DataFrame({"A":[1, 2, 3], 
        "B":[3,4,5]}) 

    A B 
0 1 3 
1 2 4 
2 3 5 

df2 = pd.DataFrame({"A":[1, 2, 3, 2, 3, 3], 
        "B":[3,4,5, 4, 5, 5]}) 

    A B 
0 1 3 
1 2 4 
2 3 5 
3 2 4 
4 3 5 
6 3 5 

df.locの値[0、 'A']は1であるので、追加の行が追加されていませんB = 3は一度だけ発生するはずなので、DataFrameの最後まで。

df.locの値[1、「A」]はそう一人の観察が2に

に値をB = 4の合計の発生をもたらし、データフレームの末尾に追加された、2でありますdf.loc [2、 'A']は3なので、DataFrameの最後に2つの観測値が追加され、B = 5の合計が3になりました。

私は始めましたが、運はありません。どんな助けもありがとうございます。

答えて

4

あり、すべての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_reindexusing_locの両方とも、dfには一意のインデックスがあります。


using_reindexは(残念ながら)今 削除ポストに、cᴏʟᴅsᴘᴇᴇᴅのusing_locから来ました。 cᴏʟᴅsᴘᴇᴇᴅは、すべての値を手動で繰り返す必要はないことを示しました。インデックスを繰り返して、df.loc(またはdf.reindex)にすべての行を繰り返してください。 dfに複数のdtypeの列が含まれている場合は、df.valuesにアクセスして、object dtypeの中間NumPy配列を生成することも回避します。

+0

私は好奇心からベンチマークを行い、最初のソリューションは私の10倍の速さです。私がoutclassed時を知っている;) –

関連する問題