Pandas - 将列存储为csv

时间:2017-02-23 03:01:18

标签: python pandas

我有一个数据集,其中每一行代表一个独特的销售。一列代表该销售中订购的商品,以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 / pandas比较陌生。这段代码可以正常工作,但是当我迭代所有订单时,它很慢。有什么更好的方法呢?

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)

4 个答案:

答案 0 :(得分:4)

为了避免遍历所有行,您可以使用numpy.repeat制作列Order ID,同时展平Items Ordered并从中创建新数据框:

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

答案 1 :(得分: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

这将完成你的工作。

答案 2 :(得分:0)

可能对您有所帮助的是pandas.DataFrame.apply。它允许您将函数应用于每一行。您可以定义一个函数来抓取行中的items元素,将其拆分,然后调用pandas.DataFrame.append为每个项创建一个新行。

以下是关于如何使用apply函数的example

答案 3 :(得分: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))

或者上面结合pivot和set_index步骤的更简洁的解决方案是:

df1 = pd.melt(df, id_vars = ['order_id'])