我正在尝试更新(pandas dataframe)列值,如下所示:
1234(456
应该成为1234
abcde(fg
应该成为abcde
我编写了以下代码,但由于某种原因它无效:
energy[(energy['Country'].str.contains('\(')) &
(energy['Country'] != np.NAN)
].apply(lambda x: x['Country'].split('(')[0])
以下是错误:ValueError: cannot index with vector containing NA / NaN values
任何改进我的代码并使其有效的想法?
答案 0 :(得分:2)
试试这个:
In [23]: df
Out[23]:
Country
0 1234(456)
1 abcde(fg xxxx
In [24]: df.Country.str.replace(r'([^\(]*).*', r'\1')
Out[24]:
0 1234
1 abcde
Name: Country, dtype: object
答案 1 :(得分:1)
尝试以下方法。它取代了第一个字符串if(在字符串中,否则它返回原始字符串。
energy['Country'] = energy.apply(lambda x: x['Country'].split("(")[0] if "(" in x['Country'] else x['Country'], axis=1)
答案 2 :(得分:1)
你可以试试这个:
energy['Country'] = energy['Country'].astype(str).map(lambda x: x.split('(')[0] if '(' in x else x)
答案 3 :(得分:1)
假设我们的格式与您的DF
相似:
energy = pd.DataFrame(dict(Country=[np.NaN, '1234(456', 'abcde(fg', np.NaN, 'pqrst'],
State=['A','B','C','D','E']))
energy
让我们看看创建的布尔掩码的第一部分:
mask1 = energy['Country'].str.contains('\(')
mask1
0 NaN
1 True
2 True
3 NaN
4 False
Name: Country, dtype: object
当您尝试使用此蒙版时,您会得到:
energy[mask]
ValueError: cannot index with vector containing NA / NaN values
这很明显,因为同时存在bool和float dtypes。
另外,第二个面具:
mask2 = energy['Country'] != np.NAN # --> In python, the Nan's don't compare equal
mask2
0 True
1 True
2 True
3 True
4 True
Name: Country, dtype: bool
你可以清楚地看到,虽然我们已经创建了一个掩码,但是有一些Nan的存在并没有转换为它们的布尔类型。
方法1:
一种方法是将str.contains
中的NaN
的默认值设置为False
,例如:
mask = energy['Country'].str.contains('\(', na=False) #
mask
0 False
1 True
2 True
3 False
4 False
Name: Country, dtype: bool
然后,使用它:
energy[mask].apply(lambda x: x['Country'].split('(')[0], axis=1)
1 1234
2 abcde
dtype: object
方法2:
另一种方法是使用dropna
然后创建掩码:
mask = energy['Country'].dropna().str.contains('\(')
mask
1 True
2 True
4 False
Name: Country, dtype: bool