编码格式处理、文件或dataFrame的操作
来源:互联网 发布:html登录界面源码 编辑:程序博客网 时间:2024/06/05 19:33
目录:
- 编码格式处理
- 普通的csv文件处理
- dataFrame的读写函数
- dataFrame处理单位:单元格(慢速、细致)
- dataFrame处理单位:整行、整列
- dataFrame处理单位:整表
- Series格式
一、编码格式处理
1、头文件写 #coding=utf-8,你才能写中文注释。
2、xls 等格式,虽然能用一下方式打开,但尽量转了csv再打开。
neg_data = pd.read_excel(u'neg.xls', header=None)[0] # 使用第一页pos_data = pd.read_excel(u'pos.xls', header=None)[0]
3、解码时可以尝试:GBK,GB18030,以及GB2312。
4、输出unicode 码
print repr(u'哈') # 结果 u'\u54c8'
5、中文unicode码的范围
if u'\u4e00'<= ch and ch <= u'\u9fa5': print '是中文unicode字符'
6、NAN空值的判断
if isinstance(row.View, float): # 如果在本行 View 这一列是空值 print '是空值'
7、encode、decode的区别以及使用
if isinstance(s, unicode): # 评估是否已被解码(unicode码)过了 print s.encode('gb2312') #当字符串s=u"中文"时执行。 gb2312代表ascii码else: print s.decode('utf-8').encode('gb2312') #当s="中文"时执行。 先解码,后加码。(utf8码解码成unicode码,再加码成ascii码)word = [v.encode("utf8") for v in word] # ascii码转成utf8
8、如何把python默认的ascii码,改成默认utf8等其他编码。处理后,你导出的东西,就默认为utf8等编码了,就不会是ascii编码。参考来源
import sysreload(sys)print sys.getdefaultencoding() # 输入出正在使用的系统默认编码。sys.setdefaultencoding("utf8")
9、unichr把10进制或者16进制数转化为字符
t = random.randint(0x4e00, 0x9fa5)print unichr(t)
10、一份文件是utf8格式的,但是对于1个中文字符的len,并不等于1。这时需要decode解码就可以了。
v= v.decode("utf-8")
二、普通的csv文件处理
参考来源
1、打开文件、关闭文件。writer.writerow()方法中的参数是list类型,如果你想在A1列写入’hello’,则必须是writer.writerow([‘hello’])
tmp = open('test1.csv', 'wb')writer=csv.writer(tmp)writer.writerow(['col1', 'col2', 'col3'])data=[range(3) for i in range(3)]for item in data: writer.writerow(item)tmp.close()tmp = open('test1.csv', 'rb')reader=csv.reader(tmp)for item in reader: print itemtmp.close()
三、dataFrame的读写函数
注意事项:
1、pd.to_csv的sep =”,” 因为有时候句子本来就有 “,” 所以导出的时候pd库为了避免歧义,自动会加上双引号到该句子中。不过让你read_csv 出来后,却是一点问题都没有的。
比如句子:严重问题,且售后态度差,不解决问题 # 会被转为带引号的–> “严重问题,且售后态度差,不解决问题”
2、读取dataFrame文件
pd.read_csv('add_view.csv', encoding='utf8') #encoding只是起到告诉该文件的编码格式。读取后,字符串只会变成unicode码(python内部编码)。to_csv时,是告诉应该编译成什么码文件。views = pd.read_csv('./data/add_view.csv', sep='\t', encoding='utf8').brands.values.tolist() # 地址处的. 代表在当前项目。 直接把brands 这一列转化成list .encoding 规定了译码格式。label = pd.read_csv('Label.csv', sep='\t', dtype=str, encoding='utf8') #dtype表示转码成str,它还可以是列表,代表指定某列转为某种类型。例如 dtype={‘col_1’: np.float64, ‘col_2’: np.int32}
3、读取文件时,index_col列,是不受 dtype参数影响的,它的类型是自动选择的。我暂时的方法是,比如我想要它是str格式,手动增加一个带字母的数据。它就能自动改了。
train_data = pd.read_csv('Train.csv', index_col=0, delimiter='\t', encoding='utf-8',dtype=str)
4、导出dataFrame表 方式1
train_data = pd.DataFrame(columns=['SentenceId', 'Content'])train_data.SentenceId = sentenceId_traintrain_data.Content = clean_train_reviewstrain_data.to_csv('TrainData.csv', index=False, encoding='utf8', sep='\t')
5、导出dataFrame表 方式2
df2 = pd.DataFrame()df2["WIFI_TAG"] = wifi_tag # list 格式df2["WIFI_index"] = wifi_indexdf2.to_csv('wifi_dist.csv',index=None,sep=',',encoding='utf-8')
6、读写df编码不一致。【原文件是由哪种编码写的,最好保持一致。当然也能强行改编码。】
r = pd.read_csv("test1.csv", index=None, sep=',',encoding= 'utf8')r.to_csv("test1.csv", index=None, sep=',',encoding= 'gbk') #会报错,UnicodeEncodeError 说明是Unicode编码时候的问题. 而‘gbk’ codec can’t encode character说明是将Unicode字符编码为GBK时候出现的问题,即包含了一些无法转换为GBK编码的一些字符。
7、解决方案1:在对unicode字符编码时,添加ignore参数,忽略无法无法编码的字符,这样就可以正常编码为GBK了。
gbkTypeStr = unicodeTypeStr.encode(“GBK“, ‘ignore’);
8、解决方案2:或者,将其转换为GBK编码的超集GB18030编码 (即,GBK是GB18030的子集):
gb18030TypeStr = unicodeTypeStr.encode(“GB18030“);
9、pd.read_csv的内部参数
- names:默认None,不传入自己新写的列名。否则,传入自己新写的列名。mangle_dupe_cols=True 时,新写的列名才能有重复。
- header:默认是inter,也就是能推理出你要哪种。如果你names参数是None,它就设置header=0 第一行作为列名。反则,header=None文件内没有作为列名的,而使用names传来的名字作为列名。
header:【主要是上面,本处不常用的,只为完整性】当它是一个int的list的时,表示这些行号的值作为列名,从list中的最大值往下才是正式输入的数据。- skip_blank_lines:默认True,跳过空行(只是跳过整一行都为空的,一行中某个属性为空,不会跳过),就不解释为Nan了。此处会影响全局的行号顺序。
四、dataFrame处理单位:单元格(慢速、细致)
print label["Opinion"][2] # 输出具体的某一项具体数据。
1、dataFrame 的两种迭代 itertuples() iterrows() 分别得到Pandas Series格式,暂时我觉得这两种格式功能没什么区别。取某列即 row.col_1 效果是一样的。区别: pandas依旧保留int 格式更准确,Series 拓展功能更加多。
df = pd.DataFrame([[1, 1.5],[344,66.7]], columns=['col_1', 'col_2'])for row in df.itertuples(): print row,type(row)# 输出:Pandas(Index=0, col_1=1, col_2=1.5) <class 'pandas.core.frame.Pandas'> Pandas(Index=1, col_1=344, col_2=66.700000000000003) <class 'pandas.core.frame.Pandas'> if isinstance(row.View, float): # 如果在本行 View 这一列是空值 print '是空值'for idx, row in df.iterrows(): # 比上面多个idx,这是行号。 print row,type(row)# 输出:col_1:1.0 col_2:1.5 Name: 0, dtype: float64 <class 'pandas.core.series.Series'> col_1:344.0 col_2:66.7 Name: 1, dtype: float64 <class 'pandas.core.series.Series'>for label, col in df.iteritems(): # 逐列循环。 print label
2、dataFrame修改某个单元格数据 set_value
row_id = 0for row in df.itertuples(): if isinstance(row.SentenceId, float): df.set_value(row_id,'SentenceId',row.id) # 输入三个参数:行号、列号、要修改成什么值 df.set_value(row_id,'View',row.brands)
3、使用iter对index索引进行遍历,并把索引值放到i变量中,tqdm记录进度条。lambda 整体相当于一个输入变量是i的函数。dict 是把后面的映射到前面 lambda函数中。
def doc2id(s): return list(word2id[list(s)].fillna(len(word2id)+1).astype(np.int32))train_data['doc2id'] = map(lambda i: doc2id(train_data.loc[i, 'Content']), tqdm(iter(train_data.index))) # 使用 loc 指定行号、列号。
4、iloc 逻辑序号索引、loc 标签索引。能用loc就尽量使用loc,可以避免出错。参考来源
index_loc = ['a','b']data = [[77,33],[88,44]]columns = ['one','two']df1 = pd.DataFrame(data=data,index=index_loc,columns=columns)# index代表行、columns代表列。此处用['a','b']作为行号。print(df1.loc['a']) #人工定义的行标签。 one 77 two 33 Name: a, dtype: int64 。 如果有多行都是这个标签,将会返回多行。print(df1.iloc[1])# 只能输出整型,index逻辑的序号。one 88 two 44 Name: b, dtype: int64print df1.loc[:,'one']#上面两个是针对行的,这里列的。输出 a 77 b 88 Name: one, dtype: int64
五、dataFrame处理单位:整行、整列
view_opinion = label[label.SentenceId == id_] # id一致匹配(三列:id,view,opinion)view_id_ = view_opinion.values[:, 1].tolist() # label中的viewopinion_id_ = view_opinion.values[:, 2].tolist() # label中的opinion
1、sort_values 进行排序
df.sort_values(by=['SentenceId'])
2、dataFrame 删除、插入(行)数据是很慢的,反倒利用它本来的特性。进行两个表的concat 就能插入,下面两个语句是进行选择性提取哪些行数据。
result = result[:cnt]result = result[result.Opinion != result.Opinion2]
3、删除列。del:直接在原表中删除某一列。drop:不改动原表,而返回新的删除后的表。pop:输出并删除某一列。 参考来源
del df["a_col"]df2 = df.drop(["a_col","b_col"],axis=1)# 删除了指定的两列。one_col = df.pop("a_col")
4、dataFrame 增加一列
df.insert(2,'col_2',df['col_1']) # 插入第2下标个列位置,命名为 col_2 ,初始值为复制 原来col_1 这一列的值X_test["new_Content"] = new_Content # 注意如果是在某个函数中 X_test作为参数传进来,直接复制,会报副本不准这样做的警报。但 insert参数却不会,使用范围更广。X_test.insert(5,"new_Content",new_Content)
5、dataFramed的遍历映射 参考来源
label.Opinion[label.Opinion == 'pos'] = 1 # 将标签应射程数字.如果这样报错,就改用loc等函数可以避免问题,这是因为chained assignment链接分配、关系到内存分配。label.Opinion[label.Opinion.isin(a_set)] = 2 # 如果Opinion 出现的值在一个集合a_set中出现过,才映射成2.label.Opinion[~label.Opinion.isin(a_set)] = 3 # 代表与上式取反的效果。label.Opinion = 4# 一列的全部数值都复制为同一个。
6、可以使用dtypes来查看各列的数据格式(但列内的具体某个格式,可能不同,所以建议遍历dataFrame,用type【区别dtype】逐个打印对应列的格式。)
print df.dtypes # 结果 col_1:int64 col_2:object
7、空值的填充及筛选
df = df.fillna("$") # 使用 $ 进行填充。df = df[df.jieba_Content != "$"]
8、计算全部列的平均值,然后取出特定的一列平均值。
all_mean = np.mean(df, axis=0) # 获取全部列的平均值,遇到不能取平均值的,会自动跳过。
print all_mean.loc[u"chwp1kw"] # 由上面的全部平均值结果,指定某一列的平均值结果。
9、对dataFrame格式的调用apply(某函数)
ner_data = train_data['doc2id'].apply(lambda s: s[:maxlen] + [0] * (maxlen - len(s[:maxlen])))
10、astype 修改单列数据类型 参考来源
df['涨跌幅'] = df['涨跌幅'].astype(np.float64)
11、对于一个dataFrame表 用groupby函数 注意[]里面代表任意组合得选,满足一个就行。()表示固定哪两列。是不同的。
group = train_data.groupby(["SentenceId","Content"])group = train_data.groupby(("SentenceId","Content"))for name, g in group: if len(g) >= 2: print name, g
六、dataFrame处理单位:整表
1、多个df表之间的操作
对于两个dataFrame表 不是增加行就用它的merge函数。 如果目的只是叠加增加行,使用concat
official = pd.concat([official, official_chusai], ignore_index=True) # 一个dataFrame 的列表,然后他就能进行上下的简单叠加了。 ignore_index 代表忽略 原来各表的行号。official = official.append(official_chusai, ignore_index=True) # 效果与上面等同pd.merge(left_table, right_table, on=['key1', 'key2'])result = table_1.merge(table_2,left_on=['SentenceId','View'],right_on=['id','brands'],how='outer') # table_1 有left_on 的全部列属性,然后与right_on 的属性一一对应。
2、复制一个dataFrame
new_df = df.copy(True)
3、使用as.matrix() 或 values 实现 DataFrame格式转化成 numpy.ndarray格式。
print train_label.loc[[i]] # 输出:"""SentenceId View Opinion 028168 桑塔纳 neu028168 奔弛 neu"""print train_label.loc[[i]].as_matrix() # 输出"""[[u'\u6851\u5854\u7eb3' u'neu'] [u'\u5954\u5f1b' u'neu']]"""
dataFrame、Series 通用as_matrix()、values。官方推荐使用values。
DataFrame.as_matrix(columns=None)DataFrame.values #同样得到numpy矩阵
2、apply函数通用在Series、dataFrame格式,不过两者参数不同。而其他方面格式也能用,但用得不多。 参考来源
作用:如果使用在dataFram格式中,可以指定行处理、还是列处理。如果Series,就只能逐个Series的值进去了。
返回值:Series或者DataFrame。如果不是调用np的内部函数,就肯定是返回Series格式。
>>> series = pd.Series([20, 21, 12], index=['London','New York','Helsinki'])>>> seriesLondon 20New York 21Helsinki 12dtype: int64>>> def square(x):... return x**2>>> series.apply(square)London 400New York 441Helsinki 144dtype: int64
3、series.apply(list) # 这是为了转Series的值的格式,而键保持不变。
4、
print type(train_data), type(train_data["predict"]) # <class 'pandas.core.frame.DataFrame'> <class 'pandas.core.series.Series'>for v in train_data["predict"]: print v # 这里一下子就输出完了一个二维矩阵,我觉得有些奇怪。 break
七、Series格式
1、使用value_counts()能够统计频率 参考来源
word2id = ''.join(train_data['Content']) + ''.join(test_data['Content']) + ''.join(addition_data)print pd.Series(list(word2id))[:5] # 输出: 0 测| 1 试| 2 的| 3 主| 4 角word2id = pd.Series(list(word2id)).value_counts() # 32023410 个字,作为值,然后value_counts 统计不重复的值有多少个。print word2id[:5] # 输出: 我 1096254| 的 859533| 车 672453| 人 450219| 。 446586
2、使用[]可以进行“选择”,得到迭代后的值。这样就能放回原变量后面进行选择。
print [word2id >= min_count] # 输出 [我 True; 的 True; 车 True ; 人 True]word2id = word2id[word2id >= min_count]# 利用上面的结果进行真正的“选择”。
3、使用[:]代表本变量也进行遍历,该变量的某个数值被映射赋值。
word2id[:] = range(1, len(word2id)+1) # 不可以省略[:]print word2id[:5]# 输出: 我 1| 的 2| 车 3| 人 4| 。 5
4、字符串转int或其他格式。
list(word2id[list("我的人")]) # 输出[1,2,4]。 其中word2id是以词为索引,值是int格式。
5、不能对Serier直接用np.array转格式,而应该Series先转list,最后转array。例如:当键是int,值是numpy.array,的Series数组one_series。
print np.array(one_series).shape # 无法获取np.array的长度,只能输出(155767L,)print np.array(x_.as_matrix()).shape # 依旧无法解决 ,只能输出(155767L,)print np.array([ list(v) for v in one_series ]).shape # 这时才能获取np.array的长度,输出(155767L, 200L)print np.array(list(one_series))# 这时也能获取np.array的长度,输出(155767L, 200L)
6、dataFrame格式需要靠itertuples()等函数迭代,Series不用。
print type(train_data), type(train_data["predict"]) # <class 'pandas.core.frame.DataFrame'> <class 'pandas.core.series.Series'>for v in train_data["predict"]: # 可以直接迭代。 print v
- 编码格式处理、文件或dataFrame的操作
- 文件的编码格式
- 文件编码,文件或文件名编码格式转换
- 文件编码,文件或文件名编码格式转换
- 文件编码,文件或文件名编码格式转换(转)
- java 编码格式的处理
- java文件读写操作指定编码格式
- java文件读写操作指定编码格式
- java文件读写操作指定编码格式
- java文件读写操作指定编码格式
- java文件读写操作指定编码格式
- 获取文件的编码格式
- 获取文件的编码格式
- 判断文件的编码格式
- 判断文件的编码格式
- 使用juniversalchardet-1.0.3.jar判断字符或文件的编码格式
- 基于DataFrame的StopWordsRemover处理
- Linux下查看文件编码,文件或文件名编码格式转换
- JavaWeb项目 实现https会话
- 实验二
- Java解惑-笔记
- HDU
- RTEMS学习
- 编码格式处理、文件或dataFrame的操作
- SSD的源码解读——MultiBoxLoss函数定义
- linux 全局搜索 grep
- 那些我们玩的“XSS”哈!
- 学完C语言结构体后的小项目编写(教务系统)
- 用户日志分析系统实战(四)
- 记大学计网课设——基于B/S架构的视频点播系统设计
- python 连接mysql数据库API安装
- WinPcap笔记:VisualStudio2015配置WinCap