Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 有条件地复制行/使用有条件地返回行的函数进行转换_Python 2.7_Pandas_Apply_Pandas Groupby - Fatal编程技术网

Python 2.7 有条件地复制行/使用有条件地返回行的函数进行转换

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'

我想通过将列“one”扩展到索引为“derby”的所有行来创建一个新的列“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']
)

您可以这样做,让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