Python - 基于其他列条件的新列[重复]

Posted

技术标签:

【中文标题】Python - 基于其他列条件的新列[重复]【英文标题】:Python - New Column based on condition of other Column [duplicate] 【发布时间】: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 的数据

【问题讨论】:

【参考方案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]

这应该为你做。

【讨论】:

以上是关于Python - 基于其他列条件的新列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas df 操作:如果其他列行重复,则带有值列表的新列 [重复]

将数据框的新列分配给与其他数据框匹配的值[重复]

根据熊猫数据框中其他列的条件和值创建新列[重复]

Python:如何在比较其他列时将列值填充到另一个数据框中的新列?

dplyr 创建一个具有其他列的复杂用户定义函数的新列

使用Spark中的复杂条件和滞后自引用创建新列