根据另一个列值在同一列中划分行

时间:2017-01-27 14:54:12

标签: python sql pandas

我是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()会在这里帮助我,虽然我不完全确定如何。

请注意这是我的问题的简化版本,我认为它不会对解决方案造成太大影响,但是我不感兴趣的其他列也不会影响计算。

2 个答案:

答案 0 :(得分:1)

您可以使用set_indexunstack进行重塑,然后除以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