如何使用其原始值的子字符串更新列值

时间:2016-11-17 18:19:50

标签: python pandas dataframe

我正在尝试更新(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

任何改进我的代码并使其有效的想法?

4 个答案:

答案 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

enter image description here

让我们看看创建的布尔掩码的第一部分:

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