我有一个类似于以下内容的数据框。
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格式。
答案 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