如何在遍历熊猫数据框时创建新列并插入行值

Posted

技术标签:

【中文标题】如何在遍历熊猫数据框时创建新列并插入行值【英文标题】:How to create new column and insert row values while iterating through pandas data frame 【发布时间】:2016-03-11 18:50:26 【问题描述】:

我正在尝试创建一个逐行遍历熊猫数据框的函数。我想根据其他列的行值创建一个新列。我的原始数据框可能如下所示:

df:

   A   B
0  1   2
1  3   4
2  2   2

现在我想在每个索引位置创建一个用 A 列 - B 列的行值填充的新列,因此结果如下所示:

 df:

       A   B   A-B
    0  1   2   -1
    1  3   4   -1
    2  2   2    0

我的解决方案有效,但仅当我不在函数中使用它时:

for index, row in df.iterrows():
        print index
        df['A-B']=df['A']-df['B']

这给了我想要的输出,但是当我尝试将它用作函数时,我得到一个错误。

def test(x):
    for index, row in df.iterrows():
        print index
        df['A-B']=df['A']-df['B']
    return df
df.apply(test)

ValueError: cannot copy sequence with size 4 to array axis with dimension 3

我在这里做错了什么,我怎样才能让它工作?

【问题讨论】:

您只需要相互减去列还是只是一个简单的例子? 我实际上只需要一个新列,其中包含 A 列减去 B 列的结果 【参考方案1】:

这是因为apply 方法默认适用于列,如果您想通过行将axis 更改为1:

axis : 0 or ‘index’, 1 or ‘columns’,默认0

0 或“索引”:将函数应用于每一列 1 或“列”:将函数应用于每一行
df.apply(test, axis=1)

编辑

我认为您需要对每一行进行一些复杂的操作。如果您只需要相互减去列:

df['A-B'] = df.A - df.B

【讨论】:

有道理,谢谢。我仍然遇到同样的错误,尽管它似乎仍然有效...... 对我来说,它可以与axis=1axis=0 双向工作,您使用的是什么pandas 版本? 我使用的是 0.17.0 版 @AntonProtopopov 这种方法也可以用于常量吗?例如my_df['Division by constant c'] = my_df.column_A / 4 ?【参考方案2】:

正如 Anton 所指出的,您应该使用 axis=1 参数执行 apply 函数。但是,没有必要像在函数测试中那样循环遍历行,因为 apply documentation 提到:

传递给函数的对象是系列对象

所以你可以将函数简化为:

def test(x):
    x['A-B']=x['A']-x['B']
    return x

然后运行:

df.apply(test,axis=1)

请注意,实际上您将测试的参数命名为x,而在函数test 中根本没有使用x

最后我要评论的是,您可以使用 pandas 进行按列操作(即没有 for 循环),只需这样做:

df['A-B']=df['A']-df['B']

另见:

how to compute a new column based on the values of other columns in pandas - python How to apply a function to two columns of Pandas dataframe

【讨论】:

谢谢,不知道不用for循环也能创建新列! 其实这是一个新问题。但是,之前已经问过:***.com/questions/18472634/… df['A-B']=df['A']-df['B'] 如果您想通过外部函数从右侧传递任何内容,则不起作用。例如df['A-B'] = my_function(df['A']) 将不起作用。相反,您必须使用以下语法:df['A-B'] = df.apply(lambda x: my_function(x.A), axis=1),如***.com/a/52854800/6793507中所述

以上是关于如何在遍历熊猫数据框时创建新列并插入行值的主要内容,如果未能解决你的问题,请参考以下文章

如何迭代熊猫数据框并创建新列

在将带有空字符串的新列添加到熊猫数据框时替换现有列名

如何遍历列,检查任何列中是不是存在特定值,改变新列并输入 1 如果存在,如果不存在则输入 0?

如何创建创建新列并修改现有列的 UDF

如何删除一列并创建一个新列而不是在 EF Core 中重命名?

熊猫列值到行值