所以我有一个已从CSV读取的数据框。它具有36列和3000+行。我想在包含以分号分隔的项目的列上拆分数据框。
它正在购买数据,并且大多数行我只想复制下来进行拆分;例如:发票编号,销售代表等。这是第一步,我在SO上找到了很多答案,但是没有答案可以解决第二部分。
还有其他几列:需要根据拆分重新计算数量,扩展成本,扩展价格和扩展毛利润。对于相关列中具有值的行,数量对于列表中的每个项目都必须为1;随后的列将需要根据该列重新计算。
请参见下面的DF示例:
我将如何处理?
很多实现都使用df.split(';')
,有些使用df.apply
,但是不幸的是,我不了解从头到尾的过程。
编辑:这是我正在寻找的输出: Proposed output
答案 0 :(得分:1)
使用大熊猫0.25.1+,您可以使用explode
:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Quantity':[6,50,25,4]
,'Column in question':['1;2;3;4;5;6','','','7;8;9;10']
,'Price':['$1.00','$10.00','$0.10','$25.00']
,'Invoice Close Date':['9/3/2019','9/27/2019','9/18/2019','9/30/2019']})
df_out = df.assign(ciq=df['Column in question'].str.split(';')).explode('ciq')\
.drop('Column in question', axis=1)\
.rename(columns={'ciq':'Column in question'})
df_out['Quantity'] = (df_out['Quantity'] / df_out.groupby(level=0)['Quantity'].transform('size'))
df_out
输出:
Quantity Price Invoice Close Date Column in question
0 1.0 $1.00 9/3/2019 1
0 1.0 $1.00 9/3/2019 2
0 1.0 $1.00 9/3/2019 3
0 1.0 $1.00 9/3/2019 4
0 1.0 $1.00 9/3/2019 5
0 1.0 $1.00 9/3/2019 6
1 50.0 $10.00 9/27/2019
2 25.0 $0.10 9/18/2019
3 1.0 $25.00 9/30/2019 7
3 1.0 $25.00 9/30/2019 8
3 1.0 $25.00 9/30/2019 9
3 1.0 $25.00 9/30/2019 10
详细信息:
首先,使用str.split
和assign
创建一个包含列表的列。
接下来,使用explode
,然后将rename
后面的新列drop
改成旧名称。