【问题标题】:Change entire pandas Series based on conditions根据条件更改整个熊猫系列
【发布时间】:2026-02-03 08:40:01
【问题描述】:

在我的 pandas DataFrame 中,我想根据另一列 (OldCol) 的数据遵循的某些条件添加一个新列 (NewCol)。

更具体地说,我的专栏OldCol 包含三种类型的字符串:

  1. BB_sometext
  2. sometext1
  3. 一些文本 1

我想区分这三种类型的字符串。现在,我使用以下代码做到了这一点:

df['NewCol'] = pd.Series()
for i in range(0, len(df)):
    if str(df.loc[i, 'OldCol']).split('_')[0] == "BB":
        df.loc[i, 'NewCol'] = "A"
    elif len(str(df.loc[i, 'OldCol']).split(' ')) == 1:
        df.loc[i, 'NewCol'] = "B"
    else:
        df.loc[i, 'NewCol'] = "C"

尽管这段代码似乎可以工作,但我确信有更好的方法来做这样的事情,因为这看起来效率很低。有谁知道更好的方法来做到这一点?提前致谢。

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    一般来说,您需要如下公式:

    >>> df.loc[boolean_test, 'NewCol'] = desired_result
    

    或者,for multiple conditions注意每个条件周围的括号,以及相当不符合 Python 标准的 & 而不是 and):

    >>> df.loc[(boolean_test1) & (boolean_test2), 'NewCol'] = desired_result
    

    示例

    让我们从一个例子开始Data.Frame

    >>>  df = pd.DataFrame(dict(OldCol=['sometext1', 'sometext 1', 'BB_ccc', 'sometext1']))
    

    然后你会这样做:

    >>> df.loc[df['OldCol'].str.split('_').str[0] == 'BB', 'NewCol'] = "A"
    

    将所有BB_ 列设置为A。您甚至可以(为了便于阅读,可选地)将布尔条件分离到自己的行中:

    >>> oldcol_starts_BB = df['OldCol'].str.split('_').str[0] == 'BB'
    >>> df.loc[oldcol_starts_BB, 'NewCol'] = "A"
    

    我喜欢这种方法,因为它意味着读者不必弄清楚隐藏在 split('_').str[0] 部分中的逻辑。

    然后,设置所有没有空格的列,这些列仍未设置(即isnull 为真):

    >>> oldcol_has_no_space = df['OldCol'].str.find(' ') < 0
    >>> newcol_is_null = df['NewCol'].isnull()
    >>> df.loc[(oldcol_has_no_space) & (newcol_is_null), 'NewCol'] = 'C'
    

    最后,将NewCol 的所有剩余值设置为B

    >>> df.loc[df['NewCol'].isnull(), 'NewCol'] = 'B'  
    >>> df
           OldCol NewCol
    0   sometext1      C
    1  sometext 1      B
    2      BB_ccc      A
    3   sometext1      C
    

    【讨论】: