【问题标题】:Python pandas apply on more columnsPython pandas 适用于更多列
【发布时间】:2015-02-04 17:00:14
【问题描述】:

如何使用 apply 和更多列在数据框中生成更多列?我的 df 是:

    A   B   C
0  11  21  31
1  12  22  31

如果我只想生成一个完美运行的列:

df['new_1']=df[['A','C','B']].apply(lambda x: x[1]/2, axis=1)

结果是:

    A   B   C  new_1
0  11  21  31   15.5
1  12  22  32   16.0

但是,如果我想生成多个列怎么办? 这非常有效:

df[['new_1','new_2']]=df[['A','C']].apply(lambda x: [x[1]/2,x[1]*2], axis=1)

结果是:

    A   B   C  new_1  new_2
0  11  21  31   15.5     62
1  12  22  32   16.0     64

但是如果我想在 apply 中使用多于两列呢?

df[['new_1','new_2']]=df[['A','B','C']].apply(lambda x: [x[1]/2,x[2]*2], axis=1)

我收到此错误:

KeyError: "['new_1' 'new_2'] not in index"

有什么帮助吗?我使用 Python 2.7 和 pandas 0.15.2

谢谢!

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:

    在 apply 中使用 Series 构造函数通常可以解决问题:

    In [11]: df[['new_1','new_2']] = df[['A','B','C']].apply(lambda x: pd.Series([x[1]/2,x[2]*2]), axis=1)
    
    In [12]: df
    Out[12]:
        A   B   C  new_1  new_2
    0  11  21  31     10     62
    1  12  22  31     11     62
    

    没有它我看到一个不同的错误(分配之前):

    In [21]: df[['A','B','C']].apply(lambda x: [x[1]/2,x[2]*2], axis=1)
    ValueError: Shape of passed values is (2, 2), indices imply (2, 3)
    

    【讨论】:

    • 如果我想返回不同类型的元素怎么办? pd.Series([str(x[1]/2),x[2]*2]) 返回错误:(
    • @ragesz 在上面的例子中对我有用,什么版本的熊猫,什么错误? (也许值得提出一个新问题)
    • 好的,我的问题是 pd.Series 对象只能有一种数据类型。当然这不是问题。如果系列中的所有元素都是数字,则数据类型可以是浮点数,但如果一个元素是系列中的对象 (str),则系列类型将是对象。 pd.Dataframe.apply 方法或简单的 pd.DataFrame 将识别我的新列值是否都是数字而不是 pd.Series 所说的对象,因此列数据类型将是浮点数而不是对象。
    • 但是如果我使用时间戳呢?我想从时间戳创建一个日期时间(日期)列和一个对象(日期名称)列。在这种情况下,pd.Series 类型将是错误的日期时间,因为“日期名称”列。我可以将日期时间值转换为对象,而不是 pd.Series 类型将是 objcet。但是在日期时间 pd.DataFrame 将无法识别我的第一列的值是否都是日期时间但不是对象,因此我必须手动将数据类型更改为日期时间。
    • 或者我必须使用两个单独的 pd.DataFrame.apply - 一个用于日期时间列,另一个用于对象列。我认为两种“单列应用”方法在性能上比一种“双列应用”方法差。
    猜你喜欢
    • 2020-07-13
    • 2016-05-22
    • 1970-01-01
    • 2021-08-30
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2016-09-14
    相关资源
    最近更新 更多