2017-02-23 1 views
3

私は、各行がユニークな販売を表すデータセットを持っています。 1つの列は、その販売で注文された商品をCSVとして表します。パンダ - csvとして格納された分割カラム

「注文したアイテム」列の値を分割する必要があります。注文したアイテムごとに、元の注文IDに関連付けられた一意の行を作成します。例えば

Order ID Items Ordered 
    127 Item 1, Item 2, Item 3 

は次のようになります。

Order ID Items Ordered 
    127   Item 1 
    127   Item 2 
    127   Item 3 

私は、Python /パンダには比較的新しいです。このコードは機能しますが、すべてのオーダーを繰り返し処理するほど遅いです。これを行うにはより良い方法は何ですか?

temp_item_list = [] 

for row in raw_data.iterrows(): 
    for i in range(len(row['Items'])): 
     temp_item_list.append((row['ID'], row['Items'][i])) 

item_df = pd.DataFrame(temp_item_list) 
+0

答えをご確認ください。 –

答えて

2

similar answerへの参照を使用すると、このステップバイステップガイドを試みることがあります。

>>> initial_df = pandas.read_csv("your_file_path") 
>>> final_df = pandas.concat([Series(row['Order ID'], row['Items Ordered'].split(',')) for _, row in initial_df.iterrows()]).reset_index() 
>>> final_df 
    index 0 
0 Item 1 127 
1 Item 2 127 
2 Item 3 127 
>>> final_df.columns= ['Items Ordered','Order ID'] 
>>> final_df 
    Items Ordered Order ID 
0  Item 1  127 
1  Item 2  127 
2  Item 3  127 
>>> final_df[['Order ID','Items Ordered']] 
    Order ID Items Ordered 
0  127  Item 1 
1  127  Item 2 
2  127  Item 3 

これはあなたの仕事を得るでしょう。

0

あなたを助けるかもしれない何かはpandas.DataFrame.applyです。これにより、すべての行に関数を適用できます。行のitems要素をつかんで分割し、pandas.DataFrame.appendを呼び出して各項目の新しい行を作成する関数を定義することができます。

apply関数の使用方法については、exampleをご覧ください。

4

すべての行を反復処理を避けるために、あなたはItems Orderedを平坦化しながら、列Order IDを作るためにnumpy.repeatを使用して、このことから、新たなデータフレームを作ることができますが:

from itertools import chain 
import numpy as np 
import pandas as pd 

# count the number of items in the items order column 
items_count = df["Items Ordered"].str.count(",") + 1 

# extend the Order ID column with numpy repeat and flatten Items Order column 
pd.DataFrame({"Order ID": np.repeat(df["Order ID"], items_count), 
       "Items Ordered": list(chain.from_iterable(df["Items Ordered"].str.split(",")))}) 

enter image description here

0

これはあなたが探しているものであることために;

df = pd.DataFrame({'order_id':127, 'items_ordered': ['item_1, item_2, item_3']}) 
df1 = pd.concat([df.order_id,df.items_ordered.str.split(',').apply(pd.Series)],axis=1,ignore_index=True) 
df1 = df1.pivot(index = df1.index, columns = df1.columns[0]).stack().stack().to_frame() 
df1 = df1.set_index(df1.index.get_level_values(level=1)) 

は、または代わりに上記ピボットとset_indexのステップを組み合わせ、より簡潔な解決策は以下のとおりです。

df1 = pd.melt(df, id_vars = ['order_id']) 
関連する問題