как удалить 3-буквенные или 4-буквенные слова из столбца данных - PullRequest
1 голос
/ 28 мая 2019

У меня есть кадр данных, как показано ниже:

import pandas as pd
import dask.dataframe as dd
a = {'b':['category','categorical','cater pillar','coming and going','bat','No Data','calling','cal'],
     'c':['strd1','strd2','strd3', 'strd4','strd5','strd6','strd7', 'strd8']
    }
df11 = pd.DataFrame(a,index=['x1','x2','x3','x4','x5','x6','x7','x8'])

Я хотел удалить слова, длина каждого значения которых равна трем.Я ожидаю, что результаты будут как:

   b                         c
category                   strd1    
categorical                strd2     
cater pillar               strd3
coming and going           strd4      
NaN                        strd5      
No Data                    strd6        
calling                    strd7         
NaN                        strd8

Ответы [ 5 ]

4 голосов
/ 28 мая 2019

Используйте series.str.len(), чтобы определить длину строки в серии, а затем сравните с series.eq(), затем, используя df.loc[], вы можете присвойте значения b как np.nan, где условие соответствует:

df11.loc[df11.b.str.len().eq(3),'b']=np.nan

                   b      c
x1          category  strd1
x2       categorical  strd2
x3      cater pillar  strd3
x4  coming and going  strd4
x5               NaN  strd5
x6           No Data  strd6
x7           calling  strd7
x8               NaN  strd8
3 голосов
/ 28 мая 2019

Используйте str.len, чтобы получить длину каждой строки, а затем условно замените их на NaN на np.where, если длина равна 3:

df11['b'] = np.where(df11['b'].str.len().eq(3), np.NaN, df11['b'])

                  b      c
0          category  strd1
1       categorical  strd2
2      cater pillar  strd3
3  coming and going  strd4
4               NaN  strd5
5           No Data  strd6
6           calling  strd7
7               NaN  strd8
2 голосов
/ 28 мая 2019

Может быть, проверить mask

df11.b.mask(df11.b.str.len()<=3,inplace=True)
df11
Out[16]: 
                   b      c
x1          category  strd1
x2       categorical  strd2
x3      cater pillar  strd3
x4  coming and going  strd4
x5               NaN  strd5
x6           No Data  strd6
x7           calling  strd7
x8               NaN  strd8
0 голосов
/ 28 мая 2019

Вы можете использовать условное выражение:

    df11['b'] = df11['b'].where(df11.b.map(len) != 3, np.nan)
0 голосов
/ 28 мая 2019

Что-то вроде:

for i, ele in enumerate(df11['b']):
    if len(ele) == 3:
        df11['b'][i] = np.nan
...