【问题标题】:How to assign columns while ignoring index alignment如何在忽略索引对齐的情况下分配列
【发布时间】:2013-04-05 10:50:37
【问题描述】:

假设我在 Pandas 中有两个数据框 xy,我想用 y 中的一列排序结果填写 x 中的一列。我试过这个:

x['foo']  = y['bar'].order(ascending=False)

但它不起作用,我怀疑因为 Pandas 在分配期间在xy(具有相同的索引集)之间对齐索引

如何让 Pandas 用另一个数据帧中的另一列忽略索引的对齐来填充 x['foo']

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我能想到的让pandas 忽略索引的最简单方法是给它一些没有索引可以忽略的东西。从

    开始
    >>> x = pd.DataFrame({"foo": [10,20,30]},index=[1,2,0])
    >>> y = pd.DataFrame({"bar": [33,11,22]},index=[0,1,2])
    >>> x
       foo
    1   10
    2   20
    0   30
    >>> y
       bar
    0   33
    1   11
    2   22
    

    我们有通常的对齐方法:

    >>> x["foo"] = y["bar"].order(ascending=False)
    >>> x
       foo
    1   11
    2   22
    0   33
    

    或未对齐的,通过将x["foo"] 设置为列表:

    >>> x["foo"] = y["bar"].order(ascending=False).tolist()
    >>> x
       foo
    1   33
    2   22
    0   11
    

    【讨论】:

    • 我明白了,谢谢。 my_series.tolist() 会比 np.array(my_series)my_series.values() 更好/更差吗?
    • 除了在某些边界情况下,我不知道它是否会有很大的不同。想一想,my_series.values 可能会更好,因为它不必通过 Python 列表,因此可以更快。 [检查..是的,至少有时它更快。]
    • to_listtolist 有什么区别?我怀疑它们是一样的,但我怎样才能确定呢?
    • @AmelioVazquez-Reina 请注意,它只是 .values 没有括号
    【解决方案2】:

    我尝试了代码,但似乎 order() 方法已被弃用,这并不奇怪,因为最初的问题已经很老了。所以现在我们只剩下sort_values() 来实现相同的结果。 最重要的是,还有一个改进之处在于使用to_numpy(),因为它稍微快一些,并且在大数据帧的情况下可能有用(.values 甚至更快,但建议在生产时使用to_numpy(),如解释的那样这里:https://stackoverflow.com/a/54324513/4909087)

    >>> x["foo"] = y["bar"].sort_values(ascending=False)
    >>> x
       foo
    1   33
    2   22
    0   11
    
    >>> %timeit x["foo"] = y["bar"].sort_values(ascending=False).to_list()
    165 µs ± 965 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    >>> %timeit x["foo"] = y["bar"].sort_values(ascending=False).to_numpy()
    136 µs ± 421 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    >>> %timeit x["foo"] = y["bar"].sort_values(ascending=False).values
    129 µs ± 826 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多