如果等于另一个熊猫列,则从熊猫列中删除字符串的右侧部分

时间:2021-02-25 17:22:16

标签: python pandas dataframe

当我尝试将字符串的左侧部分作为 Pandas 数据帧时,我有一个 nan 值,其中左侧条件取决于数据帧另一列中单元格的长度:

df 示例:

<头>
短语 颜色
保罗喜欢红色 红色
迈克喜欢绿色 绿色
约翰喜欢蓝色 蓝色

我的目标是在“like {Color}”之前获得一系列短语 => 的第一部分。 这将是:

|名字|

|保罗 | |迈克 | |约翰|

我尝试调用下面的函数:

df["First  Name"] = df["Phrase"].str[:- df["Color"].str.len() - 6]

但我一直有 Nan 值结果。似乎我对颜色的长度计算无法传输到我的 str[:-x] 函数。

有人可以帮助我了解这里发生的情况并找到解决方案吗?

非常感谢。祝你有美好的一天。

2 个答案:

答案 0 :(得分:1)

考虑以下df

In [128]: df = pd.DataFrame({'Phrase':['Paul like red', 'Mike like green', 'John like blue', 'Mark like black'], 'Color':['red', 'green', 'blue', 'brown']})

In [129]: df
Out[129]: 
            Phrase  Color
0    Paul like red    red
1  Mike like green  green
2   John like blue   blue
3  Mark like black  brown

使用numpy.where

In [134]: import numpy as np

In [132]: df['First Name'] = np.where(df.apply(lambda x: x['Color'] in x['Phrase'], 1), df.Phrase.str.split().str[0], np.nan)

In [133]: df
Out[133]: 
            Phrase  Color First Name
0    Paul like red    red       Paul
1  Mike like green  green       Mike
2   John like blue   blue       John
3  Mark like black  brown        NaN

答案 1 :(得分:1)

让我们分解一下并尝试了解发生了什么.. .str 返回一个 pandas.Series.str (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.html) 对象,您想使用向量对其进行切片。

所以基本上你正在尝试做 pandas.Series.str[: <some_vector>] 其中 <some_vector>- df["Color"].str.len() - 6

不幸的是,pandas 没有提供使用向量切片的方法,请在此处检查所有方法:https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html

所以我们只能使用 pandas.Series.str[: some_value]

现在,由于此 some_value 对每一行都发生了变化,因此您可以对每一行使用 .apply 方法,如下所示:

df = pd.DataFrame({
    'Phrase': ['Paul like red', 'Mike like green', 'John like blue'],
    'Color': ['red', 'green', 'blue']
})
>>>
Phrase  Color
0    Paul like red    red
1  Mike like green  green
2   John like blue   blue

def func(x):
    return x['Phrase'][:-len(x['Color'])-6]
   

df['First Name'] = df.apply(func, axis=1)

>>>


print (df)
            Phrase  Color First Name
0    Paul like red    red       Paul
1  Mike like green  green       Mike
2   John like blue   blue       John

这里我使用了相同的逻辑,但使用 .apply

将值作为标量传递