我将UCREL语义分析系统(USAS)加载到一些歌词中。下面是一个结果示例:
因为Z5/A2.2 Z8 is A3 Z4 A5.1 do A1.1.1 not Z6 stop T2- me Z8mf right Z4(因为Z5/A2.2表示Z8是正确的)A5.1 do A1.1.1不是stop T2-me Z4
每个单词都有一个语义标签。所有这些标签都在http://ucrel.lancs.ac.uk/usas/semtags.txt上
我需要计算每个标签的出现次数。因此,我尝试使用Pandas编写代码。这没什么大不了的。问题是我需要计算标签,直到点(.)之后的第二个数字。例如," A1.1“、"A1.1.1”或"A1.1.2“必须算作A1.1
我运行的初始代码如下,但它只是简单地计算所有标签的出现次数,并且没有我上面解释的条件。
import re
import pandas as pd
import pandas.io.common
from pprint import pprint
import glob
files = glob.glob("/[folder name]/**/*.txt", recursive = True)
files = list(filter(lambda file: os.stat(file).st_size > 0, files))
for file in files:
data = pd.read_csv(file, engine='python', encoding='utf-8', error_bad_lines=False, header=None, usecols=[1], sep=' ')
data[1].value_counts().reset_index().to_csv(str(file) +'_totals.txt')请问我如何添加我需要的条件?
发布于 2021-06-27 01:47:14
让我们尝试使用str.split,然后将第一个值保持为2,然后将str.join重新组合在一起:
out = df[1].str.split('.').str[:2].str.join('.').value_counts().reset_index()或使用map
out = df[1].map(lambda s: '.'.join(s.split('.')[:2])).value_counts().reset_index()out
index 1
0 A1.5 3
1 A1.1 2
2 A1.4 1
3 A1.3 1
4 A1.6 1
5 A1.7 1
6 A1.2 1*注意,这里不能使用最大分割长度的rsplit,因为这样A1.5就会转换为A1,而不是保持为A1.5。
使用的样本数据:
df = pd.DataFrame({1: ['A1.1.1', 'A1.1.2', 'A1.2', 'A1.3', 'A1.4', 'A1.5',
'A1.5.1', 'A1.5.2', 'A1.6', 'A1.7']})df
1
0 A1.1.1
1 A1.1.2
2 A1.2
3 A1.3
4 A1.4
5 A1.5
6 A1.5.1
7 A1.5.2
8 A1.6
9 A1.7步骤分解:
df[1].str.split('.')0 [A1, 1, 1]
1 [A1, 1, 2]
2 [A1, 2]
3 [A1, 3]
4 [A1, 4]
5 [A1, 5]
6 [A1, 5, 1]
7 [A1, 5, 2]
8 [A1, 6]
9 [A1, 7]
Name: 1, dtype: objectdf[1].str.split('.').str[:2]0 [A1, 1]
1 [A1, 1]
2 [A1, 2]
3 [A1, 3]
4 [A1, 4]
5 [A1, 5]
6 [A1, 5]
7 [A1, 5]
8 [A1, 6]
9 [A1, 7]
Name: 1, dtype: objectdf[1].str.split('.').str[:2].str.join('.')0 A1.1
1 A1.1
2 A1.2
3 A1.3
4 A1.4
5 A1.5
6 A1.5
7 A1.5
8 A1.6
9 A1.7
Name: 1, dtype: objecthttps://stackoverflow.com/questions/68144872
复制相似问题