Python 根据条件更改整个熊猫系列

Python 根据条件更改整个熊猫系列,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,在我的pandas数据框中,我想根据另一列(OldCol)的数据所遵循的一些条件,添加一个新列(NewCol) 更具体地说,我的列OldCol包含三种类型的字符串: BB_sometext sometext1 一些文字1 我想区分这三种类型的字符串。现在,我使用以下代码完成了此操作: df['NewCol'] = pd.Series() for i in range(0, len(df)): if str(df.loc[i, 'OldCol']).split('_')[0] == "BB

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

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

  • BB_sometext
  • sometext1
  • 一些文字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"
    

    尽管这段代码看起来很有效,但我确信有更好的方法来做类似的事情,因为这似乎效率很低。有人知道更好的方法吗?提前感谢。

    通常,您需要以下配方:

    >>> df.loc[boolean_test, '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\uu
    列设置为
    A
    。您甚至可以(可选地,为了可读性)将布尔条件分离到自己的行中:

    >>> oldcol_starts_BB = df['OldCol'].str.split('_').str[0] == 'BB'
    >>> df.loc[oldcol_starts_BB, 'NewCol'] = "A"
    
    我喜欢这种方法,因为它意味着读者不必计算出
    split(“''').str[0]
    部分中隐藏的逻辑

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

    >>> oldcol_starts_BB = df['OldCol'].str.split('_').str[0] == 'BB'
    >>> df.loc[oldcol_starts_BB, 'NewCol'] = "A"
    
    >>> 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'
    
    >>> df.loc[df['NewCol'].isnull(), 'NewCol'] = 'B'  
    >>> df
           OldCol NewCol
    0   sometext1      C
    1  sometext 1      B
    2      BB_ccc      A
    3   sometext1      C