因为以前很少用pandas,但这两周用它处理数据比较多,因此做下小结。我的感受应该和大家一样,就是pandas处理列很方便。
大纲
- pandas与dict的相互转换
- 取所有的列名
- 取某几列
- 改变某几列的类型
- 缺失值填充
- to_csv()
- 元素为list
- unique
- 新增一列
- dataframe合并
- dataframe的one-hot
0. pandas与dict的相互转换
import pandas as pd
### dict2pandas
# 按列生成
d = {
'Name':['Alisa','Bobby','jodha','jack','raghu','Cathrine',
'Alisa','Bobby','kumar','Alisa','Alex','Cathrine'],
'Age':[26,24,23,22,23,24,26,24,22,23,24,24],
'Score':[85,63,55,74,31,77,85,63,42,62,89,77]}
df = pd.DataFrame(d,columns=['Name','Age','Score'])
# 按行生成
data = {'row_1': [3, 2, 1, 0], 'row_2': ['a', 'b', 'c', 'd']}
pd.DataFrame.from_dict(data, orient='index')
'''
0 1 2 3
row_1 3 2 1 0
row_2 a b c d
'''
pd.DataFrame.from_dict(data, orient='index',columns=['A', 'B', 'C', 'D'])
'''
A B C D
row_1 3 2 1 0
row_2 a b c d
'''
### pandas2dict
d = {'col1': [[1,2], [2,3]], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
#按列
df.to_dict('list')
# {'col2': [3, 4], 'col1': [[1, 2], [2, 3]]}
# 按行
df.to_dict('records')
#每一列的类型
print type(df['col1'])
#pandas.core.series.Series
pandas2dict还有很多种形式可以选择。
1. 取所有的列名
#方法1, 有人验证该方法最快
_CSV_COLUMNS = df.columns.values.tolist()
#方法2
_CSV_COLUMNS = list(df.columns.values)
#方法3
_CSV_COLUMNS = list(df)
2. 取某几列
df1 = df[["Name", "Age"]]
3. 改变某几列的类型
print df.dtypes
'''
Name object
Age int64
Score int64
'''
# 方法1
df[["Age"]] = df[["Age"]].astype(str)
'''
Age object
Name object
Score int64
'''
# 方法2
df.Age = df.Age.astype(str)
注意,在这个方法里一定是赋值给自身,不然会报错!!!
4. 缺失值填充
# 对所有的nan填充
df.fillna("0")
# 对某一列填充
df["Age"] = df["Age"].fillna("0")
5. to_csv()
df = pd.DataFrame({'name': ['Raphael', 'Donatello'],
'mask': ['red', 'purple'],
'weapon': ['sai', 'bo staff']})
df.to_csv(index=False)
'''
# 'name,mask,weapon\nRaphael,red,sai\nDonatello,purple,bo staff\n'
# 否则会变成
# ',name,mask,weapon\nRaphael,red,sai\nDonatello,purple,bo staff\n'
# 莫名其妙多了一列
'''
有点坑啊,一定要记得带参数index=False
6. 元素为list
d = {'col1': [[1,2], [2,3]], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
print df
"""
col1 col2
0 [1, 2] 3
1 [2, 3] 4
"""
但是有个问题,带list元素的df可以保存到csv文件,但是读出来时元素类型变成了str。
7. unique
df["col1"].unique()
多补充一句,numpy里也有unique的用法,numpy.unique(a)
8. 新增一列
df[new_column_name] = new_values
### insert
df.insert(column_index, column_name, column_values)
9. dataframe合并
# 按列合并
df1=pd.DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])
df2=pd.DataFrame(np.random.randn(3,3),columns=['e','f','g'])
pd.concat([df1,df2], axis=1)
'''
a b c d e f g
0 0.266801 0.272503 0.809910 0.087132 0.195794 0.802969 0.475941
1 -0.704941 -0.026970 -0.305641 -1.686097 -1.006638 -0.468813 -0.772434
2 0.595480 -1.912895 -1.079995 -0.890516 -0.045435 -1.386298 0.716604
'''
此外,还有merge的用法,和SQL的join类似
10. dataframe的one-hot
d = {'col1': [[1,2], [2,3]], 'col2': ["a", "b"]}
df = pd.DataFrame(data=d)
pd.get_dummies(df['col2']).astype('float')
#astype('float')是因为get_dummies得到的类型为unit8,需要转化成float后才行进行数值计算
astype('float')是因为get_dummies得到的类型为unit8,需要转化成float后才行进行数值计算
网友评论