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 sys
reload(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")
参考来源
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 item
tmp.close()
注意事项:
1、pd.to_csv的sep ="," 因为有时候句子本来就有 “,” 所以导出的时候pd库为了避免歧义,自动会加上双引号到该句子中。不过让你read_csv 出来后,却是一点问题都没有的。
比如句子:严重问题,且售后态度差,不解决问题。
该句会被转为带引号的:“严重问题,且售后态度差,不解决问题”
2、读取dataFrame文件
header参数:填为None时,表示不使用表里面的数据作为列名。
names参数:自定义一些列名。这个很有用。
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_train
train_data.Content = clean_train_reviews
train_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_index
df2.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 时,新写的列名才能有重复。
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) Pandas(Index=1, col_1=344, col_2=66.700000000000003)
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 col_1:344.0 col_2:66.7 Name: 1, dtype: float64
for label, col in df.iteritems(): # 逐列循环。
print label
2、dataFrame修改某个单元格数据 set_value
row_id = 0
for 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,可以避免出错。参考来源
注意:我实践发现,table.loc[:, [“Y”]].isin([“PA”]) 返回的是DataFrame格式,所以虽然你看到True、False,但它实际是浮点数来的。而table.iloc[:, 4].isin([“PA”])返回是Series格式里面的True、False,才是布尔型。而my_file[布尔型数组]的筛选,是要布尔型,DataFrame转Series型,可以写列名,如 table.Y 就转了。
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: int64
print df1.loc[:,'one']#上面两个是针对行的,这里列的。输出 a 77 b 88 Name: one, dtype: int64
print df1.iloc[:,0]#上面两个是针对行的,这里列的。简而言之,[,]的第一个位置是控制行,第二个位置是控制列。
view_opinion = label[label.SentenceId == id_] # id一致匹配(三列:id,view,opinion)
view_id_ = view_opinion.values[:, 1].tolist() # label中的view
opinion_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 增加一列:insert函数 参考官方
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
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 桑塔纳 neu
028168 奔弛 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'])
>>> series
London 20
New York 21
Helsinki 12
dtype: int64
>>> def square(x):
... return x**2
>>> series.apply(square)
London 400
New York 441
Helsinki 144
dtype: int64
3、series.apply(list) # 这是为了转Series的值的格式,而键保持不变。
4、DataFrame.head(n=5):打印表格的前n行 参考官方
print(df.head())
5、排序 参考博客
sort_index:根据行或列的索引跑排序。
sort_values:根据数值排序。
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"]) #
for v in train_data["predict"]: # 可以直接迭代。
print v
7、排名:rank函数 参考博客、参考官方-Series
已经实践,有空摘录到这里就行。比较简单的。