我有一个数据框,在每个字段中都有字段名称:
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。
如何高性能删除多余的字段名称?
答案 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:]