【问题标题】:Python - New Column based on condition of other Column [duplicate]Python - 基于其他列条件的新列[重复]
【发布时间】:2020-11-01 11:36:45
【问题描述】:

我有一个包含以下内容的数据框列:

Audience
searchretargeting
data-capture-320x50
purchase-behavior-320x500
data-capture-728x90

我想通过基于“-”分隔符拆分“受众”列来创建一个新列 (Audience2),理想情况下只想保留拆分的第一个元素(“数据”而不是“捕获- 320x50')

如果没有“-”,我希望用“受众”中的内容填充新列(例如搜索重定向):

Audience               Audience2
siteretargeting        siteretargeting
data-capture-320x50    data

我知道如何拆分 Audience 列,但是当列中没有“-”时,我希望添加某种类型的逻辑来规避新列为 NaN

df['Audience2']=df['Audience'].str.split('-').str[1]

这会拆分 Audience 列并仅保留第一个元素,但我一直在努力使用各种 if-else 和 apply-lambda 语句来弄清楚如何提取没有“-”而不是 NaN 的数据

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试这个:

    df['Audience'].str.split('-').str[0].fillna(df['Audience'])
    

    输出:

    0    searchretargeting
    1                 data
    2             purchase
    3                 data
    Name: Audience, dtype: object
    

    【讨论】:

    • 这很聪明~
    • 不错的答案。虽然如果我们得到第一个项目str[0]fillna 有必要吗?如果我们使用str[0] 而不使用fillna,我似乎得到了原始值。
    • @MasayoMusic NaN 来自于 '-' 没有出现在原始字符串中的事实,因此 split 方法返回一个 NaN,没有列表所以得到 str[0] 是不可能。
    【解决方案2】:

    让我们用ffill修复

    df.Audience.str.split('-',expand=True).ffill(axis=1).iloc[:,1]
    0    searchretargeting
    1              capture
    2             behavior
    3              capture
    Name: 1, dtype: object
    

    更多信息

    df.Audience.str.split('-',expand=True).ffill(axis=1)
                       0                  1                  2
    0  searchretargeting  searchretargeting  searchretargeting
    1               data            capture             320x50
    2           purchase           behavior            320x500
    3               data            capture             728x90
    

    【讨论】:

      【解决方案3】:

      你可以试试np.where:

      df['Audience2']=np.where(df.Audience.str.contains('-'), df.Audience.str.split('-').str[0],df.Audience)
      

      输出:

      df
                          Audience          Audience2
      0          searchretargeting  searchretargeting
      1        data-capture-320x50               data
      2  purchase-behavior-320x500           purchase
      3        data-capture-728x90               data
      

      【讨论】:

        【解决方案4】:

        你可以改用这样的东西 -

        df['Audience2']=df['Audience'].str.split('-').str[1]
        for i in range(len(df)):
          if pd.isna(df['Audience2'][i]):
            df['Audience2'][i] = df['Audience'][i]
        

        【讨论】:

          【解决方案5】:
          df['audience2'] = [i.split('-')[0] for i in df.audience if '-' in i else i]
          

          这应该为你做。

          【讨论】:

            猜你喜欢
            • 2021-07-31
            • 2018-09-26
            • 2015-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-18
            • 2019-10-09
            • 1970-01-01
            相关资源
            最近更新 更多