编码格式处理、文件或dataFrame的操作

来源:互联网 发布:html登录界面源码 编辑:程序博客网 时间:2024/06/05 19:33

目录:

  1. 编码格式处理
  2. 普通的csv文件处理
  3. dataFrame的读写函数
  4. dataFrame处理单位:单元格(慢速、细致)
  5. dataFrame处理单位:整行、整列
  6. dataFrame处理单位:整表
  7. 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
原创粉丝点击