对于下面的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]
})
答案 0 :(得分:1)
您似乎可以先创建NaN
,而不是option
B
,然后再分回填充的NaN
值:
注意:DataFrame
必须先按year
,month
和option
排序,以获得每个组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