【问题标题】: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)

我的问题是:

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

【问题讨论】:

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

标签: python pandas conditional-statements apply rows


【解决方案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没有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多