删除数据框中所有数据点中的多余字符

时间:2018-10-18 00:58:51

标签: python pandas performance dataframe

我有一个数据框,在每个字段中都有字段名称:

   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]

这非常慢,并且不是pythonic。

如何高性能删除多余的字段名称?

4 个答案:

答案 0 :(得分:3)

您可以使用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:])

答案 1 :(得分:1)

从字符串中删除字符:

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

未经测试的迭代示例:

for column in data:        
    data[column] = data[column].map(lambda x: x.lstrip(column + '='))

答案 2 :(得分:1)

使用with

for col in df.columns:
   df[col] = df[col].str[len(col)+1:]

答案 3 :(得分:0)

由于您知道要在每列中删除的字符的长度,因为它是=的列名称,因此您可以对列进行循环for并用{{1选择字符串的结尾}}:

str[len(col)+1:]