我是python的新手并使用数据帧。我有一个数据帧格式如下。
TYPE | FLAG | PROP
---- | ---- | ----
A | 0 | 0.1
B | 0 | 0.2
C | 0 | 0.5
D | 0 | 0.2
A | 1 | 0.15
B | 1 | 0.4
C | 1 | 0.3
D | 1 | 0.15
我想为TYPE创建一个新的索引数据框。 (即,通过PROP将FLAG = 1划分为PROP = FLAG = 0)
理想情况下,我希望最终得到(如果有帮助,我已经离开了计算):
TYPE | INDEX
---- | ----
A | 1.5 (= 0.15/0.1)
B | 2 (=0.4/0.2)
C | 0.6 (=0.3/0.5)
D | 0.75 (=0.15/0.2)
如果我使用SQL,我可能会写这样的东西。
select type,
one_prop/zero_prop as index
from (
select account_type
, max(case when index=1 then prop else 0 end) as prop_A
, max(case when index=0 then prop else 0 end) as prop_B
from table
) a
非常感谢任何帮助。我有一种感觉df.groupby()
会在这里帮助我,虽然我不完全确定如何。
请注意这是我的问题的简化版本,我认为它不会对解决方案造成太大影响,但是我不感兴趣的其他列也不会影响计算。
答案 0 :(得分:1)
您可以使用set_index
与unstack
进行重塑,然后除以div
:
df = df.set_index(['TYPE','FLAG'])['PROP'].unstack()
df['INDEX'] = df[1].div(df[0])
#drop columns, reset index and remove column name
df = df.drop([0,1], axis=1).reset_index().rename_axis(None, axis=1)
print (df)
TYPE INDEX
0 A 1.50
1 B 2.00
2 C 0.60
3 D 0.75
pivot
的另一个解决方案:
df = df.pivot(index='TYPE', columns='FLAG', values='PROP')
df['INDEX'] = df[1].div(df[0])
df = df.drop([0,1], axis=1).reset_index().rename_axis(None, axis=1)
print (df)
TYPE INDEX
0 A 1.50
1 B 2.00
2 C 0.60
3 D 0.75
使用DataFrame
构造函数的解决方案:
df = df.pivot(index='TYPE', columns='FLAG', values='PROP')
a = df[1].div(df[0])
df = pd.DataFrame({'TYPE':a.index,'INDEX':a.values}, columns=['TYPE','INDEX'])
print (df)
TYPE INDEX
0 A 1.50
1 B 2.00
2 C 0.60
3 D 0.75
答案 1 :(得分:0)
由于你基本上有两个相等大小和等索引的数据帧,你可以将它们分成两个视图,而不是FLAG
并进行数学运算:
df.set_index('TYPE', inplace=True)
df
Out[17]:
FLAG PROP
TYPE
A 0 0.10
B 0 0.20
C 0 0.50
D 0 0.20
A 1 0.15
B 1 0.40
C 1 0.30
D 1 0.15
df[df.FLAG==1]['PROP']/df[df.FLAG==0]['PROP']
Out[18]:
TYPE
A 1.50
B 2.00
C 0.60
D 0.75
Name: PROP, dtype: float64