学习链接
# 分析句子长度
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())
关于代码块的详注:
def f(x):
return 2 * x + 1
print(f(5))
# 11
lambda x: 2 * x + 1
g = lambda x: 2 * x + 1
print(g(5))
# 11
lambda基本语法是用冒号分割函数的参数及返回值,冒号左边是函数的参数,若有多个,就用逗号分割。
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())
apply()
方法函数f(x)的参数x值存在一个列表里,用apply()
方法,按列表的存储顺序,以此对f进行传参。
apply(func,*args,**kwargs)
func
可以是匿名函数
参考笔记:apply()参数详解1(举例),apply()参数详解2
# 统计字符分布
all_lines = ' '.join(list(train_df['text']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key = lambda d: d[1], reversed = True)
join()
方法 str.join(sequence)
str
用来给定分隔符的形式
参数sequence
:可以是字符串、元组、列表
用途:以指定的字符(分隔符)将sequence中的元素连接起来生成一个新的字符串,返回连接后的字符串。
a = ['1', '2', '3', '4', '5']
print(' '.join(a))
# 1 2 3 4 5
print(' :'.join(a))
# 1 :2 :3 :4 :5
print('; '.join(a))
# 1; 2; 3; 4; 5
print('. '.join(a))
# 1. 2. 3. 4. 5
print(type('. '.join(a)))
#
用join()相对应的一个方法是split()
split()
方法string.split(str=" ", num=string.count(str))
str
给定分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num
给定分割次数。默认为 -1, 即分隔所有。
用途:通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,返回分割后的字符串列表。
a = "a bcd.efg;hijk:lmn aaa"
print(a.split(' '))
# ['a', 'bcd.efg;hijk:lmn', 'aaa']
print(a.split(':'))
# ['a bcd.efg;hijk', 'lmn aaa']
print(a.split(';'))
# ['a bcd.efg', 'hijk:lmn aaa']
print(a.split('.'))
# ['a bcd', 'efg;hijk:lmn aaa']
print(type(a.split('.')))
#
Counter的详细用法
# 统计字在每个句子中出现的情况
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
all_lines = ' '.join(list(train_df['text_unique']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(),key = lambda d:int(d[1]), reverse = True)
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
1、假设字符3750,字符900和字符648是句子的标点符号,请分析赛题每篇新闻平均由多少个句子构成?
biaodian_count1 = []
biaodian_count2 = []
biaodian_count3 = []
for each in train_df['text']: # 把每一行的标点次数打印出来
biaodian_count1.append(each.count('3750')) # 每个标点出现的次数
biaodian_count2.append(each.count('900'))
biaodian_count3.append(each.count('648'))
print(mean(biaodian_count1) + mean(biaodian_count2) + mean(biaodian_count3)) # 所有标点出现的平均次数
# 79.80237
自己的方法有点笨笨,看别人闪闪发光的代码
举一反三的机灵鬼!!
一行顶十行!!
2、统计每类新闻中出现次数最多的字符
def getRows(label1, trainData): # 获得包含新闻1的行名
col_label = []
i1 = 0
for each in trainData['label']:
if label1 == each:
col_label.append(i1)
i1 = i1 + 1
return col_label
别人一行代码就够了额
grouped = train_df.groupby('label')
# 统计每类新闻中出现次数最多的字符
def getRows(label1, trainData): # 获得包含新闻1abel的行名
col_label = []
i1 = 0
for each in trainData['label']:
if label1 == each:
col_label.append(i1)
i1 = i1 + 1
return col_label
def countNews(x1):
all_lines = ' '.join(str(x1)) # 将所有文本拼接起来
word_count = Counter(all_lines.split(' '))
word_count = sorted(word_count.items(), key = lambda d: int(d[1]), reverse = True)
return word_count[0]
x = []
y = []
for i in range(14):
z = x.append(getRows(i + 1, train_df))
w = y.append(countNews(z))
print("第" + str(i + 1) + "类新闻出现次数最多的字符:" + str(w))
问题:第一个def输出的是行号,
第二个def的输入是按照上述行号重新提取的文本
中间省略了按照一定行号提取并构建新的数据框的步骤。
今天改好啦,进度缓慢呀
# 统计每类新闻中出现次数最多的字符
def getRows(label, trainData): # 获得包含新闻1的行号
col_label = []
i = 0
for each in trainData['label']:
if label == each:
col_label.append(i)
i = i + 1
return col_label
def countNews(newDf):
all_lines = ' '.join(list(newDf['text'])) # 将所有文本拼接起来
word_count = Counter(all_lines.split(' '))
word_count = sorted(word_count.items(), key = lambda d: int(d[1]), reverse = True)
return word_count
train_df['text'] = train_df['text'].apply(lambda x: x.replace(' 3750', "").replace(' 900', "").replace(' 648', ""))
key = ['科技', '股票', '体育', '娱乐', '时政', '社会', '教育', '财经', '家居', '游戏', '房产', '时尚', '彩票', '星座']
for k in range(0, 14):
col_Label = []
col_Label = getRows(k, train_df)
newdf = train_df.iloc[col_Label]
w = countNews(newdf)
print("%s类新闻出现次数最多的字符%s,出现次数为%d" % (key[k], w[0][0], int(w[0][1])))
# 科技类新闻出现次数最多的字符3370,出现次数为501748
# 股票类新闻出现次数最多的字符3370,出现次数为625287
# 体育类新闻出现次数最多的字符7399,出现次数为351851
# 娱乐类新闻出现次数最多的字符6122,出现次数为187882
# 时政类新闻出现次数最多的字符4411,出现次数为120317
# 社会类新闻出现次数最多的字符6122,出现次数为159089
# 教育类新闻出现次数最多的字符6248,出现次数为193738
# 财经类新闻出现次数最多的字符3370,出现次数为158886
# 家居类新闻出现次数最多的字符6122,出现次数为57290
# 游戏类新闻出现次数最多的字符7328,出现次数为46466
# 房产类新闻出现次数最多的字符3370,出现次数为67703
# 时尚类新闻出现次数最多的字符4939,出现次数为18587
# 彩票类新闻出现次数最多的字符4464,出现次数为51420
# 星座类新闻出现次数最多的字符4939,出现次数为9648
关于数据分组:
pandas 数据框loc和iloc用法总结
这个案例使用了loc分组
python中有一个内置函数groupby,可以分组,或者按标签值直接提取