迭代通过Pandas Dataframe根据条件计算

时间:2017-01-30 16:41:39

标签: python pandas dataframe

对于下面的DataFrame,我需要创建一个新列'unit_count',即每年和每月的'unit'/'count'。但是,因为每年和每月都不是唯一的,对于每个条目,我只想使用B选项中给定月份的计数。

key UID count   month   option  unit    year
0   1   100     1       A       10      2015
1   1   200     1       B       20      2015
2   1   300     2       A       30      2015
3   1   400     2       B       40      2015

基本上,我需要一个执行以下操作的函数:

unit_count = df.unit / df.count

表示单位价值,但在给定的'月'中仅使用期权'B'的'计数'值。

因此,最终结果将如下表所示,其中unit_count将单位数除以给定月份的'扇区''B'计数。

key UID count   month   option  unit    year    unit_count
0   1   100     1       A       10      2015    0.05
1   1   200     1       B       20      2015    0.10
2   1   300     2       A       30      2015    0.075
3   1   400     2       B       40      2015    0.01

以下是我用来创建原始DataFrame的代码:

df = pd.DataFrame({'UID':[1,1,1,1],
                'year':[2015,2015,2015,2015],
                'month':[1,1,2,2],
                'option':['A','B','A','B'],
                'unit':[10,20,30,40],
                'count':[100,200,300,400]
                })

1 个答案:

答案 0 :(得分:1)

您似乎可以先创建NaN,而不是option B,然后再分回填充的NaN值:

注意:DataFrame必须先按yearmonthoption排序,以获得每个组B的最后一个值

#if necessary in real data
#df.sort_values(['year','month', 'option'], inplace=True)

df['unit_count'] = df.loc[df.option=='B', 'count']
print (df)
   UID  count  month option  unit  year  unit_count
0    1    100      1      A    10  2015         NaN
1    1    200      1      B    20  2015       200.0
2    1    300      2      A    30  2015         NaN
3    1    400      2      B    40  2015       400.0

df['unit_count'] = df.unit.div(df['unit_count'].bfill())
print (df)
   UID  count  month option  unit  year  unit_count
0    1    100      1      A    10  2015       0.050
1    1    200      1      B    20  2015       0.100
2    1    300      2      A    30  2015       0.075
3    1    400      2      B    40  2015       0.100