将函数应用于熊猫中的某些行

Posted

技术标签:

【中文标题】将函数应用于熊猫中的某些行【英文标题】:apply function to some rows in pandas 【发布时间】:2022-01-15 16:55:31 【问题描述】:

我想对 pandas 数据框中的某些行进行一些更改。根据其他一些列的内容选择要更改的行。数据集很大,我还没有找到一个不是很慢的解决方案。

下面的玩具代码说明了这个问题:

import pandas as pd

def change1(s):

    if s['a'] == 1:
        s[['b', 'c']] = s[['c', 'b']].values
    
    return s

def change2(s):

    s[['b', 'c']] = s[['c', 'b']].values
    
    return s


df = pd.DataFrame('a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9])
print('original:')
print(df)

df = df.apply(change1, axis = 1)
print('change1:')
print(df)

df = pd.DataFrame('a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9])
df.loc[df['a']==1,:] = df.loc[df['a']==1,:].apply(change2, axis=1)
print('change2:')
print(df)

我的问题是:

    为什么第二个策略 (change2) 不起作用,而第一个策略起作用? 有什么方法更正确、更快捷?

【问题讨论】:

这段代码非常混乱。尝试向我们展示一些示例数据,说明您想要做什么,然后展示您希望在对原始数据进行这些转换后看到的转换后数据的示例 【参考方案1】:

为什么不:

df.loc[df['a']==1, ['b','c']] = df.loc[df['a']==1,['c','b']].values

change2 不起作用,因为 df.loc[df['a']==1,:] 是基于作为视图返回的 df['a']==1 的 df 切片,因此当您从该切片中提取 ['b','c'] 时,您会得到一个副本,因此分配将有对原始df没有影响。

【讨论】:

以上是关于将函数应用于熊猫中的某些行的主要内容,如果未能解决你的问题,请参考以下文章

在引用列时将函数逐行应用于熊猫数据框

在熊猫应用函数中获取行的索引

如何一次将函数应用于熊猫数据框中的多个列

熊猫有效地将groupby函数应用于每一列[重复]

熊猫如何将函数应用于 groupby().first()

将函数应用于熊猫中数据框的每一列