当我尝试将字符串的左侧部分作为 Pandas 数据帧时,我有一个 nan 值,其中左侧条件取决于数据帧另一列中单元格的长度:
df 示例:
短语 | 颜色 |
---|---|
保罗喜欢红色 | 红色 |
迈克喜欢绿色 | 绿色 |
约翰喜欢蓝色 | 蓝色 |
我的目标是在“like {Color}”之前获得一系列短语 => 的第一部分。 这将是:
|保罗 | |迈克 | |约翰|
我尝试调用下面的函数:
df["First Name"] = df["Phrase"].str[:- df["Color"].str.len() - 6]
但我一直有 Nan 值结果。似乎我对颜色的长度计算无法传输到我的 str[:-x]
函数。
有人可以帮助我了解这里发生的情况并找到解决方案吗?
非常感谢。祝你有美好的一天。
答案 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