2016-05-15 12 views
4

私はこのようなデータフレームがあります。pythonの分割データフレームの列

s = df['SKU'].apply(Series,1).stack() 
s.index = s.index.droplevel(-1) 
s.name = 'SKU' 
del df['SKU'] 
df = df.join(s) 

r = df['Size'].apply(Series,1).stack() 
r.index = r.index.droplevel(-1) 
r.name = 'Size' 
del df['Size'] 
df = df.join(r) 
:私は、次のコードを試してみました

Product  ProductType  SKU  Size 
T-shirt  Top    111  XS 
T-shirt  Top    222  S 
T-shirt  Top    333  M 
T-shirt  Top    444  L 
Pant(Flared) Bottoms   555  M 
Pant(Flared) Bottoms   666  L 
Sweater  Top    None  None 

-------------------------------------------------------------------- 
Product  ProductType  SKU    Size 
-------------------------------------------------------------------- 
T-shirt  Top   [111,222,333,444] ['XS','S','M','L'] 
Pant(Flared) Bottoms  [555,666]   ['M','L'] 
Sweater  Top   None    None 

を、私は以下の出力をしたいです

しかし、これは次のように爆発する:

Product  ProductType SKU    Size 
T-shirt  Top   111    XS 
T-shirt  Top   111    S 
T-shirt  Top   111    M 
T-shirt  Top   111    L 
T-shirt  Top   222    XS 
T-shirt  Top   222    S 
T-shirt  Top   222    M 
T-shirt  Top   222    L 
T-shirt  Top   333    XS 
T-shirt  Top   333    S 
T-shirt  Top   333    M 
T-shirt  Top   333    L 
T-shirt  Top   444    XS 
T-shirt  Top   444    S 
T-shirt  Top   444    M 
T-shirt  Top   444    L 
Pant(Flared) Bottoms  555    M 
Pant(Flared) Bottoms  555    L 
Pant(Flared) Bottoms  666    M 
Pant(Flared) Bottoms  666    L 

簡単にするために、2つの列(商品、商品タイプ)が追加されていますが、文字列を含む5つの列があります。 基本的には、各製品のサイズにSKUを関連付ける必要があります。

誰でも助けてもらえますか?

答えて

4

これは非常に注意して使用したバグに開かれている:サイズ他の列(たとえば、列のSKUでのリストと同じリストのコレクションに

変換製品の列をリスト場合、これは動作しません。 SKUとサイズに

df["Product"] = df["Product"].map(list) * df["SKU"].map(len) 

Out[184]: 
        SKU   Size  Product 
0 [111, 222, 333, 444] [XS, S, M, L] [a, a, a, a] 
1   [555, 666]   [M, L]  [b, b] 

は、(それが)のリストを拡張します列の合計を取り、to_dict()でデータフレームのコンストラクタにそれを渡す)異なる長さ:

pd.DataFrame(df.sum().to_dict()) 
Out[185]: 
    Product SKU Size 
0  a 111 XS 
1  a 222 S 
2  a 333 M 
3  a 444 L 
4  b 555 M 
5  b 666 L 

編集

いくつかの列の場合、あなたが繰り返されるために列を定義することができます

cols_to_be_repeated = ["Product", "ProductType"] 

保存別のデータフレームになし値を持つ行:

na_df = df[pd.isnull(df["SKU"])].copy() 

ドロップなしの元のデータフレームから:

df.dropna(inplace = True) 
これらの列の上に

反復:

for col in cols_to_be_repeated: 
    df[col] = df[col].map(lambda x: [x]) * df["SKU"].map(len) 

と同じアプローチを使用します。

pd.concat([pd.DataFrame(df.sum().to_dict()), na_df]) 

     Product ProductType SKU Size 
0  T-shirt   Top 111.0 XS 
1  T-shirt   Top 222.0  S 
2  T-shirt   Top 333.0  M 
3  T-shirt   Top 444.0  L 
4 Pant(Flared)  Bottoms 555.0  M 
5 Pant(Flared)  Bottoms 666.0  L 
2  Sweater   Top NaN None 

それは良いかもしれないが、元のデータフレームのコピーで動作するように。

+0

サイズとSKUは常に同じサイズになります。また、Product以外の複数の列がある場合はどうなりますか。たとえば、製品タイプもProductと共に複製する必要があります。 – coder1416

+0

また、実際の製品は文字列なので、リストに変換すると、それは文字列の複数の文字として分割されます。@ayhan – coder1416

+0

データは次のようになります: 'Product Name Tシャツ製品タイプトップ ' – coder1416

関連する問題