【问题标题】:pandas DataFrame, how to apply function to a specific column?pandas DataFrame,如何将函数应用于特定列?
【发布时间】:2016-03-25 03:04:14
【问题描述】:

我已经阅读了DataFrame.apply的文档

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)¶ 沿 DataFrame 的输入轴应用函数。

那么,如何将函数应用于特定列?

In [1]: import pandas as pd
In [2]: data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
In [3]: df = pd.DataFrame(data)
In [4]: df
Out[4]: 
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
In [5]: def addOne(v):
...:        v += 1
...:        return v
...: 
In [6]: df.apply(addOne, axis=1)
Out[6]: 
   A  B   C
0  2  5   8
1  3  6   9
2  4  7  10

我想将一个添加到df['A'] 中的每个值,而不是所有列。我怎么能用DataFrame.apply做到这一点。

感谢您的帮助!

【问题讨论】:

标签: python pandas


【解决方案1】:

答案是,

df['A'] = df['A'].map(addOne)

也许你会更好地了解the difference 中的mapapplymapapply

但如果你坚持使用apply,你可以尝试如下。

def addOne(v):
    v['A'] += 1
    return v

df.apply(addOne, axis=1)

【讨论】:

  • can we apply same function at a time on both A and B.
  • @dondapati 当然,您可以简单地在 addOne 函数中添加 v['B'] += 1 。当axis = 1时,Pandas应用函数将每一行作为v。
【解决方案2】:

一种简单的方法是:

df['A'] = df['A'].apply(lambda x: x+1)

【讨论】:

  • 我做了你的建议:df['A'] = df['A'].apply(lambda x: datetime.fromtimestamp(float(x)/1000.)) 我得到了:“试图在数据帧的切片副本上设置一个值。尝试使用 .loc[row_indexer,col_indexer] = value 代替。”有什么建议吗?
  • @Catarina Nogueira 尝试在最后添加 .copy() 例如应用(...).copy()
【解决方案3】:

对于正在寻找允许管道的解决方案的其他人:

identity = lambda x: x

def transform_columns(df, mapper):
    return df.transform(
        {
            **{
                column: identity
                for column in df.columns
            },
            **mapper
        }
    )

# you can monkey-patch it on the pandas DataFrame (but don't have to, see below)
pd.DataFrame.transform_columns = transform_columns

(
    pd.DataFrame(data)
    .rename(columns={'A': 'A1'})   # just to demonstrate the motivation
    .transform_columns({'A1': add_one})
)

这也允许:

pd.DataFrame(data).transform_columns({
    'A': add_one,
    'B': add_two,
})

如果您不想对 DataFrame 进行猴子补丁,您可以随时将其与 pipe 一起使用:

pd.DataFrame(data).pipe(transform_columns, {'A': add_one})

如果熊猫天真地支持这将是很棒的。

上面的sn-ps是CC0。

【讨论】:

    【解决方案4】:

    你可以使用 .apply() 和 lambda 函数来解决这类问题。

    考虑一下,您的数据框是这样的,

    A | B | C
    ----------
    1 | 4 | 7
    2 | 5 | 8
    3 | 6 | 9
    

    您要应用的功能:

    def addOne(v):
    v += 1
    return v
    

    所以如果你这样写代码,

    df['A'] = df.apply(lambda x: addOne(x.A), axis=1)
    

    你会得到:

    A | B | C
    ----------
    2 | 4 | 7
    3 | 5 | 8
    4 | 6 | 9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 2019-04-10
      • 2020-07-02
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      相关资源
      最近更新 更多