【问题标题】:Pandas: Use index value in apply function over a columnPandas:在列的应用函数中使用索引值
【发布时间】:2017-01-02 06:44:56
【问题描述】:

我想知道是否有办法在对数据框的列使用应用时使用索引值。假设我有 df 喜欢:

  col1  col2
0    a    [0,1,2]
1    b    [0,2]
2    c    [0,1,2]

我想在 df.col2 上编写一个应用函数,以便它从 col2 中的列表中删除索引值,留下一个 df 如下:

  col1  col2
0    a    [1,2]
1    b    [0,2]
2    c    [0,1]

索引值可能在列表中,也可能不在列表中。但如果它确实存在于列表中,则应将其删除。 请注意,这不是实际用例,但与我需要的类似。我有

df.col2.apply(lambda x: f(x))

并且在 f(x) 中,如果可能或解决方法,我希望能够访问 x 的索引值。 我知道 df.apply() 可以处理列值,而 df.index.map() 可以处理索引。 Pandas 中是否有一种方法可以将两者的用例结合到一个优雅的解决方案中。感谢您的帮助。

更新:索引是一个整数值,它将被限制为它的连续整数。 col2 将为每个索引提供一个列表。我想检查索引是否在该列表中,如果存在则将其从列表中删除。因此,假设对于行索引 3,我们有列表 [27,36,3,9,7]。我想从列表中删除 3。列表是无序的

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:
    def name_drop(x):
        x_ = x.drop('col2')
        _x = pd.Series(x.col2)
        _x = _x[_x != x.name].tolist()
        x = x_.append(pd.Series({'col2': _x}))
        return x
    
    df.apply(name_drop, axis=1)
    

    【讨论】:

    • @Fizi,我的印象是索引值是一个整数,并且您想从列表中删除以索引值索引的元素。根据您的问题,我认为您想删除列表中与索引值具有相同值的项目。我会相应调整。
    • 你是对的——索引是一个整数值,它将被限制为它的连续整数。 col2 将为每个索引提供一个列表。我想检查索引是否在该列表中,如果存在则将其从列表中删除。因此,假设对于行索引 3,我们有列表 [27,36,3,9,7]。我想从列表中删除 3。列表是无序的
    【解决方案2】:

    如果我正确理解您的问题,这应该可以完成工作:

    df.apply(lambda x: x.name in x.col2 and x.col2.remove(x.name), axis=1)
    

    以原帖中的例子为例:

    In [226]: df
    Out[226]: 
      col1       col2
    0    a  [0, 1, 2]
    1    b     [0, 2]
    2    c  [0, 1, 2]
    
    In [227]: df.apply(lambda x: x.name in x.col2 and x.col2.remove(x.name), axis=1);
    
    In [228]: df
    Out[228]: 
      col1    col2
    0    a  [1, 2]
    1    b  [0, 2]
    2    c  [0, 1]
    

    【讨论】:

    • 这似乎是一个更直观的响应,但是当我运行代码时,我得到的都是 None。
    • 早期版本实际上只是打印一堆Nones(因为删除元素的结果实际上是None),但DataFrame本身仍然会更新。更新后的答案反过来产生了Nones 和Falses 的奇怪混合,但它可能更直观一些。
    【解决方案3】:

    也许你可以试试这个,这不会从列表中删除索引值,而是将其替换为 'nan'

    df = pd.DataFrame({'a':list('mno'),'b':[[1,2,3],[1,3,4],[5,6,2]]})
    df1 = df.b.apply(pd.Series)
    df['b'] = np.array(df1[df1.apply(lambda x: x!=df.index.values)]).tolist()
    

    Out[111]: a b 0 m [1.0, 2.0, 3.0] 1 n [nan, 3.0, 4.0] 2 o [5.0, 6.0, nan]

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 2016-12-22
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      相关资源
      最近更新 更多