用“;”分隔数据框的列复制所有静态行并对其他行进行数学运算

时间:2019-10-23 13:30:50

标签: python pandas

所以我有一个已从CSV读取的数据框。它具有36列和3000+行。我想在包含以分号分隔的项目的列上拆分数据框。

它正在购买数据,并且大多数行我只想复制下来进行拆分;例如:发票编号,销售代表等。这是第一步,我在SO上找到了很多答案,但是没有答案可以解决第二部分。

还有其他几列:需要根据拆分重新计算数量,扩展成本,扩展价格和扩展毛利润。对于相关列中具有值的行,数量对于列表中的每个项目都必须为1;随后的列将需要根据该列重新计算。

请参见下面的DF示例:

example data

我将如何处理?

很多实现都使用df.split(';'),有些使用df.apply,但是不幸的是,我不了解从头到尾的过程。

编辑:这是我正在寻找的输出: Proposed output

1 个答案:

答案 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.splitassign创建一个包含列表的列。 接下来,使用explode,然后将rename后面的新列drop改成旧名称。