熊猫 - 拆分列存储为csv
问题描述:
我有一个数据集,每一行代表一个独特的销售。一列表示在该销售中订购的物品,如CSV。熊猫 - 拆分列存储为csv
我需要将“items ordered”列中的值和每个订购的项目分开,创建一个与原始订单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
我是比较新的蟒蛇/大熊猫。此代码有效,但在遍历所有订单时很慢。有什么更好的方法来做到这一点?
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)
答
参考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
这将让你的工作做好。
答
可能对你有帮助的东西是pandas.DataFrame.apply。它允许您将函数应用于每一行。您可以定义一个函数来抓取行中的items元素,将其拆分并调用pandas.DataFrame.append为每个项目创建一个新行。
以下是关于如何使用apply函数的example。
答
为了避免迭代通过所有的行,你可以使用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(",")))})
答
可能这是你在找什么对于;
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'])
请不要检查的答案。 –