gpt4 book ai didi

python - 在没有数据透视表的情况下展平 pandas DataFrame

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:37 24 4
gpt4 key购买 nike

调用 groupby 后,我有一个 MultiIndex pandas DataFrame,需要以一种时尚的方式将其展平 similar to flattening a pivot table .大多数分析已经围绕分组对象构建,因此宁愿不必重构到数据透视表中。

考虑一些虚拟数据,

dummy_data = pd.DataFrame({'Ccy' : ['EUR', 'EUR', 'CAD', 'CAD', 'EUR', 'EUR', 'CAD', 'EUR'],
'Venue' : ['BAML']*5 + ['BARX']*3,
'Price': np.abs(np.random.randn(8)),
'volume': np.abs(10*np.random.randn(8))
},
index = pd.date_range('7/19/2017', periods=8))

dummy_data.index.name = "datetime"
print dummy_data


>>> Ccy Price Venue volume
datetime
2017-07-19 EUR 1.338521 BAML 11.227553
2017-07-20 EUR 0.882715 BAML 0.307711
2017-07-21 CAD 0.977815 BAML 14.196170
2017-07-22 CAD 1.262272 BAML 0.055213
2017-07-23 EUR 0.752433 BAML 5.315777
2017-07-24 EUR 0.699008 BARX 2.299045
2017-07-25 CAD 1.625567 BARX 6.474822
2017-07-26 EUR 2.122562 BARX 5.026135

目标是按CcyVenue 对数据进行分组,对每个子组应用filter 操作,然后将组展平为这个原始帧的格式。考虑一个简单的过滤器,它保留 price > 0.8

的行
dummy_data.groupby(['Ccy', 'Venue']).apply(lambda x: x[x['Price'] > 0.8])

>>> Ccy Price Venue volume
Ccy Venue datetime
CAD BAML 2017-07-21 CAD 0.977815 BAML 14.196170
2017-07-22 CAD 1.262272 BAML 0.055213
BARX 2017-07-25 CAD 1.625567 BARX 6.474822
EUR BAML 2017-07-19 EUR 1.338521 BAML 11.227553
2017-07-20 EUR 0.882715 BAML 0.307711
BARX 2017-07-26 EUR 2.122562 BARX 5.026135

我现在需要的是填写/展平 CcyVenue 列,这样

Ccy Venue datetime                                  
CAD BAML 2017-07-21 ... CAD BAML 2017-07-21 ...
2017-07-22 ... CAD BAML 2017-07-22 ...
BARX 2017-07-25 ... ---> BECOMES ---> CAD BARX 2017-07-25 ...
EUR BAML 2017-07-19 ... EUR BAML 2017-07-19 ...
2017-07-20 ... EUR BAML 2017-07-20 ...

我需要这样做,因为我们有一系列绘图实用程序不够灵活,无法处理分组数据。难道不应该有一个与 groupby() 操作互惠的 ungroup()flatten() 方法吗?

注意:本示例中的普通过滤器可以应用于未分组的数据。实际上,我的过滤器更复杂并且只对子组有意义。


解决方案尝试(来自 pivot table solution 的尝试 1 和 2)

尝试 1:melt 方法丢失了 datetime 索引。

    print dummy_data.groupby(['Ccy', 'Venue']).apply(lambda x: x[x['Price'] > 0.8]).melt()

>>> variable value
0 Ccy CAD
1 Ccy CAD
2 Ccy CAD
3 Ccy EUR
4 Ccy EUR
5 Ccy EUR
6 Price 0.977815
7 Price 1.26227
8 Price 1.62557
9 Price 1.33852

尝试 2: accepted answer导致 KeyError

dummy_data.groupby(['Ccy', 'Venue']).apply(lambda x: x[x['Price'] > 0.8]).unstack().reset_index().drop('level_0', axis=1)

KeyError: 'level_0'

尝试 3: reset_index() 导致 ValueError

dummy_data.groupby(['Ccy', 'Venue']).apply(lambda x: x[x['Price'] > 0.8]).reset_index()

ValueError: cannot insert Venue, already exists

尝试 4: as_index=False(没有 group_keys 关键字)

out = dummy_data.groupby(['Ccy', 'Venue'], as_index=False).apply(lambda x: x[x['Price'] > 0.8])
print out
print out.index

Ccy Price Venue volume
datetime
0 2017-07-21 CAD 0.977815 BAML 14.196170
2017-07-22 CAD 1.262272 BAML 0.055213
1 2017-07-25 CAD 1.625567 BARX 6.474822
2 2017-07-19 EUR 1.338521 BAML 11.227553
2017-07-20 EUR 0.882715 BAML 0.307711
3 2017-07-26 EUR 2.122562 BARX 5.026135
MultiIndex(levels=[[0, 1, 2, 3], [2017-07-19 00:00:00, 2017-07-20 00:00:00, 2017-07-21 00:00:00, 2017-07-22 00:00:00, 2017-07-25 00:00:00, 2017-07-26 00:00:00]],
labels=[[0, 0, 1, 2, 2, 3], [2, 3, 4, 0, 1, 5]],
names=[None, u'datetime'])

这让我非常接近,但这个对象仍然是 MultiIndexed。我们怎样才能取回日期时间索引?

最佳答案

这可能是你想要的:

dummy_data.groupby(['Ccy', 'Venue'], group_keys=False)\
.apply(lambda x: x[x['Price'] > 0.8])

关于python - 在没有数据透视表的情况下展平 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45222897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com