2016-05-28 3 views
3

У меня есть dataframe DF, который выглядит следующим образом (это пример):Как удалить все после последнего появления символа в Dataframe?

EQ1     EQ2      EQ3 
0 Apple.fruit   Oranage.eatable.fruit  NaN 
1 Pear.eatable.fruit  Banana.fruit    NaN 
2 Orange.fruit   Tomato.eatable   Potato.eatable.vegetable 
3 Kiwi.eatable   Pear.fruit    Cabbage.vegetable 
<And so on.. It is a large Dataframe> 

Я хотел бы, чтобы удалить все ПОСЛЕ ПОСЛЕДНЕГО вхождение точки . в каждом элементе DF и сохраните его под другое имя, скажем df_temp.
Желаемая Ouput:

EQ1    EQ2     EQ3 
0 Apple   Oranage.eatable  NaN 
1 Pear.eatable  Banana    NaN 
2 Orange   Tomato    Potato.eatable 
3 Kiwi    Pear    Cabbage 
<And so on> 

Это то, что я пытался: df_temp=".".join(DF.split(".")[:-1]).
К сожалению, это, похоже, работает только со строками, а не с Dataframe. Нужно ли мне немного подстроить эту строку для достижения того, чего я хочу? Кто-то, пожалуйста, помогите!

ответ

6

Вы можете сделать:

df_temp = df.apply(lambda x: x.str.split('.').str[:-1].str.join('.')) 

выход:

  EQ1    EQ2    EQ3 
0   Apple Oranage.eatable    NaN 
1 Pear.eatable   Banana    NaN 
2  Orange   Tomato Potato.eatable 
3   Kiwi    Pear   Cabbage 

см string method docs

+3

Не стоит отдельный ответ, но 'df.apply (лямбда х: x.str.rsplit (» ., 1) .str [0]) 'должен делать то же самое. – DSM

+0

Спасибо большое @ Mr.F работает! – controlfreak

1

Вы можете использовать экстракт.

df_temp = df.apply(lambda x: x.str.extract(r'.*\.([^\.]*)', expand=False)) 

df_new = df.apply(lambda x: x.str.extract(r'(.*)\.[^\.]*', expand=False)) 

df_temp выглядит следующим образом:

 EQ1  EQ2  EQ3 
0 fruit fruit  NaN 
1 fruit fruit  NaN 
2 fruit eatable vegetable 
3 eatable fruit vegetable 

df_new выглядит следующим образом:

  EQ1    EQ2    EQ3 
0   Apple Oranage.eatable    NaN 
1 Pear.eatable   Banana    NaN 
2  Orange   Tomato Potato.eatable 
3   Kiwi    Pear   Cabbage