【发布时间】:2018-01-11 08:01:56
【问题描述】:
我想通过将列 'one' 扩展到索引为 'Derby' 的所有行来创建一个新列 'derby_one',如下面的 valid_result 所示
number one two three
country town
AU Newcastle 0 1 2
Derby 3 4 5
Sydney 6 7 8
UK Derby 9 10 11
Kensington 12 13 14
Newcastle 15 16 17
USA Derby 18 19 20
transform 函数可以实现类似的结果
data.groupby(['country']).one.transform(max)
但是,我不确定如何修改它以与索引器交互
示例数据
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(21).reshape(7,3), index=pd.MultiIndex(levels=[[u'AU', u'UK', 'USA'], [u'Derby', u'Kensington', u'Newcastle', u'Sydney']], labels=[[0, 0, 0, 1, 1, 1, 2], [2, 0, 3, 0, 1, 2, 0]], names=[u'country', u'town']), columns=pd.Index(['one', 'two', 'three'], name='number'))
# create test data set
test = data.copy()
derby_one = pd.Series(np.array([0,0,0,9,9,9,18]), index=data.index)
test['derby_one'] = derby_one
注意事项
我不想使用连接/合并功能,因为我的真实数据集非常大,例如以下选项不可行
derby_one = data.loc[pd.IndexSlice[:, 'Derby'], ['one']].reset_index()
derby_one = derby_one[['country', 'one']].rename(columns={'one':'derby_one'})
pd.merge(
data.reset_index(),
derby_one,
left_on=['country'],
right_on=['country']).set_index(['country', 'town']
)
【问题讨论】:
-
一个(现已删除)答案提供了一个带有
.query('town == "Derby"')的方法,然后使用ffill填充np.nan值。但是,这取决于位置,并且在数据未排序时会失败。 1)我怀疑ffill().bfill()的组合可能会起作用。 2).loc[pd.IndexSlice[:, 'Derby']]是query的两倍,结果相同
标签: python-2.7 pandas apply pandas-groupby