根据条件计算熊猫的比例

时间:2020-03-02 23:00:34

标签: python pandas csv

我有一个类似于以下内容的数据框。

date    mood    count
1/1/16  negative    400
1/1/16  positive    500
3/1/16  negative    200
5/1/16  positive    700
5/1/16  negative    300

我想在每个日期的新列df ['ratio']中获得正/负比率。如果仅某个日期有一个正数或负数(例如 3/1/16没有正数),那么在该情况下,该日期的比率应为“ na”。

Expected output

date    ratio
1/1/16  1.25
3/1/16  na
5/1/16  2.33

如何在熊猫中做到这一点?非常感谢。仅供参考:文件为csv格式。

2 个答案:

答案 0 :(得分:1)

旋转到一个临时的DataFrame中,然后将positive除以negative

temp = df.pivot(index='date', columns='mood', values='count')
temp
mood    negative  positive
date                      
1/1/16     400.0     500.0
3/1/16     200.0       NaN
5/1/16     300.0     700.0

(temp['positive'] / temp['negative']).rename('ratio').reset_index()         
     date     ratio
0  1/1/16  1.250000
1  3/1/16       NaN
2  5/1/16  2.333333

答案 1 :(得分:0)

使用GroupBy.apply创建比率,然后使用drop_duplicates将每个比率仅保留一行:

ratios = (
    df.sort_values('mood')
      .groupby('date')['count'].transform(lambda x: x.div(x.shift()).bfill())
)

dfn = df.assign(ratio = df.index.map(ratios))
        .drop_duplicates('ratio').drop(columns=['mood', 'count'])

print(dfn)
     date     ratio
0  1/1/16  1.250000
2  3/1/16       NaN
3  5/1/16  2.333333