Python 2.7 有条件地复制行/使用有条件地返回行的函数进行转换
我想通过将列“one”扩展到索引为“derby”的所有行来创建一个新的列“derby_one”,如下面的有效结果所示 通过变换函数可以获得类似的结果 但是,我不确定如何修改它以与索引器交互 示例数据 警告 我不想使用连接/合并功能,因为我的实际数据集非常大,例如,以下选项不可行Python 2.7 有条件地复制行/使用有条件地返回行的函数进行转换,python-2.7,pandas,apply,pandas-groupby,Python 2.7,Pandas,Apply,Pandas Groupby,我想通过将列“one”扩展到索引为“derby”的所有行来创建一个新的列“derby_one”,如下面的有效结果所示 通过变换函数可以获得类似的结果 但是,我不确定如何修改它以与索引器交互 示例数据 警告 我不想使用连接/合并功能,因为我的实际数据集非常大,例如,以下选项不可行 derby_one = data.loc[pd.IndexSlice[:, 'Derby'], ['one']].reset_index() derby_one = derby_one[['country', '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']
)
您可以这样做,让Pandas为您对齐索引并仅使用“Derby”行进行查询筛选,然后使用groupby和transform在组中填充NaN值:
data['derby_one'] = data.query('town == "Derby"')['one']
data.groupby(['country'])['derby_one'].transform(max)
输出
number one two three derby_one
country town
AU Derby 0 1 2 0.0
Newcastle 3 4 5 0.0
Sydney 6 7 8 0.0
UK Derby 9 10 11 9.0
Kensington 12 13 14 9.0
Newcastle 15 16 17 9.0
USA Derby 18 19 20 18.0
嗨,Scott,我已经做了一个编辑,以避免在不依赖“Derby”位于方法列表顶部的情况下运行位置相关的答案fails@AlexanderMcFarlane可以我会修改的。@Alexander McFarlane好的,试试这个。哈,我以为你已经尽力了,只是把它全部删除了,所以我在一条评论中写道:是的,你需要保留组中的填充,所以除非它在组中的第一个或最后一个位置,我想您必须使用groupby。现在删除的答案提供了一个带有.query'town==Derby'的方法,然后使用ffill填充np.nan值。但是,这取决于位置,并且在数据未排序时失败。1但我怀疑ffill.bfill的组合可能会起作用。2.loc[pd.indexlice[:,'Derby']]的速度是具有相同结果的查询速度的两倍
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']
)
data['derby_one'] = data.query('town == "Derby"')['one']
data.groupby(['country'])['derby_one'].transform(max)
number one two three derby_one
country town
AU Derby 0 1 2 0.0
Newcastle 3 4 5 0.0
Sydney 6 7 8 0.0
UK Derby 9 10 11 9.0
Kensington 12 13 14 9.0
Newcastle 15 16 17 9.0
USA Derby 18 19 20 18.0