啊啊啊啊啊吖

2019-01-23   阅读量: 1444

数据分析师 Python数据分析

为所有可能的组合创建一行

扫码加入数据分析学习群

我有一个数据框,有许多分类项目,其中一些有一个月,其中一些没有。为了获得准确的平均值,我想找出一种方法为每个月的每个类别创建空行值,然后我可以填写余数。

数据如下所示:

skinny_month

month Amount Category

0 2019-01 18.34 Rental Car & Taxi

1 2019-01 7.95 Fast Food

2 2019-01 27.63 Restaurants

3 2019-01 69.00 Gym

4 2019-01 20.60 Air Travel

... ... ... ...

1116 2013-04 10.00 Restaurants

我想要回归的是:

skinny_month.groupby( '类别')。意思是()

Amount Notes

Category

ATM Fee 2.600000 0.0

Advertising 6.486667 0.0

Air Travel 546.166250 0.0

Books 17.631538 0.0

Business Services 9.746923 0.0

除了月份,我就可以计算出我的实际每月支出。问题是,这使我看起来平均花费比实际上多,因为例如我的广告总体看起来像这样:

skinny_month.groupby(['Category','month']).mean()

Amount

Category month

ATM Fee 2017-10 3.000000

... ... ...

Advertising 2018-06 15.340000

2018-10 9.115000

2018-11 5.350000

因此,由于2017年或2019年没有支出,因此应该更像是1.10(两年内共花费28美元等),但平均只有三个月以上,因此显示为6.48。

我有一个适当日期的早期版本并使用:

monthly_totals = non_savings.set_index('Category').resample('M', 'sum').fillna(method='ffill')

产生了

Amount Notes

Date Category Date

2013-02-16 Business Services 2013-02-28 65.00 0.0

Restaurants 2013-02-28 35.00 0.0

2019-01-16 Air Travel 2019-01-31 20.60 0.0

2019-01-17 Gym 2019-01-31 69.00 0.0

2019-01-19 Restaurants 2019-01-31 27.63 0.0

我觉得应该有一个简单的方法来生成每个类别之间的日期,但似乎ffill将无法工作,因为它需要正确的开始和结束日期,此外,因为数据仅涵盖2013年,2017年,2018年和2019年开始,向前填补它会使开支太多,因为我没有任何2014 - 2016年的记录,所以它会使广告示例下降到0.34,这也是不对的。

我试过做一个concat调用,觉得应该有一些方法来进行行智能迭代,但我无法弄明白。

添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
0.0000 0 3 关注作者 收藏

评论(1)

啊啊啊啊啊吖
2019-01-23

可以使用pd.MultiIndex.from_product

这样的一些变化:

In [24]: x = pd.date_range('2019-01-01', '2019-04-01', freq='MS')

In [25]: y = ['a', 'b', 'c']

In [26]: index = pd.MultiIndex.from_product([x, y])

In [27]: for ix in index:

...: print(ix)

...:

...:

...:

(Timestamp('2019-01-01 00:00:00', freq='MS'), 'a')

(Timestamp('2019-01-01 00:00:00', freq='MS'), 'b')

(Timestamp('2019-01-01 00:00:00', freq='MS'), 'c')

(Timestamp('2019-02-01 00:00:00', freq='MS'), 'a')

(Timestamp('2019-02-01 00:00:00', freq='MS'), 'b')

(Timestamp('2019-02-01 00:00:00', freq='MS'), 'c')

(Timestamp('2019-03-01 00:00:00', freq='MS'), 'a')

(Timestamp('2019-03-01 00:00:00', freq='MS'), 'b')

(Timestamp('2019-03-01 00:00:00', freq='MS'), 'c')

(Timestamp('2019-04-01 00:00:00', freq='MS'), 'a')

(Timestamp('2019-04-01 00:00:00', freq='MS'), 'b')

(Timestamp('2019-04-01 00:00:00', freq='MS'), 'c')

0.0000 0 0 回复

推荐课程