удалить лишние символы во всех точках данных в кадре данных - PullRequest
0 голосов
/ 18 октября 2018

У меня есть фрейм данных, в котором имена полей помещены в каждое поле:

   index          name      ngram        field     slop  
0  index=1  name=unknown   ngram=00   field=body   slop=0   
1  index=2  name=unknown   ngram=01   field=body   slop=0   
2  index=3  name=unknown   ngram=02   field=body   slop=0

Я хочу удалить дополнительные имена полей во всех точках данных во фрейме данных.Результат должен быть:

   index          name      ngram        field     slop  
0  1            unknown       00          body      0   
1  2            unknown       01          body      0   
2  3            unknown       02          body      0

Я могу удалить дополнительное имя поля, перебирая каждую точку данных фрейма данных:

for r in range(df.shape[0]):
    for c in range(df.shape[1]):
        df.iloc[r][c]=df.iloc[r][c].split('=')[1]

Это очень медленно и не является пифоническим.

Как можно удалить дополнительные имена полей с высокой производительностью?

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Использование str.replace:

df = df.replace(r'\w+\=(\w+$)', r'\1',regex=True)

print (df)

    index   name    ngram   field   slop
0    1    unknown    00      body    0
1    2    unknown    01      body    0
2    3    unknown    02      body    0
0 голосов
/ 18 октября 2018

Удаление символов из строки:

data['index'] = data['index'].map(lambda x: x.lstrip('index='))

пример непроверенной итерации:

for column in data:        
    data[column] = data[column].map(lambda x: x.lstrip(column + '='))
0 голосов
/ 18 октября 2018

Поскольку вы знаете длину символов, которую вы хотите удалить в каждом столбце, поскольку это имя столбца с =, вы можете сделать цикл for для столбцов и выбрать конец строки с помощью str[len(col)+1:]:

for col in df.columns:
   df[col] = df[col].str[len(col)+1:]
0 голосов
/ 18 октября 2018

Вы можете использовать pd.DataFrame.apply:

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

print(df)

  index     name ngram field slop
0     1  unknown    00  body    0
1     2  unknown    01  body    0
2     3  unknown    02  body    0

Это не векторизовано, так как вы работаете с серией object dtype.Скорее всего, вы захотите преобразовать определенные серии в числовые, например,

df['index'] = pd.to_numeric(df['index'])

. Для повышения производительности возможен один вызов str, сначала рассчитав длину имени каждого столбца:

d = dict(zip(df, df.columns.map(len)))
df = df.apply(lambda x: x.str[d[x.name]+1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...