>>> import pandas as pd
>>> factors={'2021':36.45,'2020':35.43,'2019':34.65,'2018':33.9,'2017':33.14}
# 必须加index,index中是列表,列表个数,即为记录数。
# 下面是以关键字为列名,共5列
>>> df = pd.DataFrame(factors,index=[1])
# 结果如下:
2021 2020 2019 2018 2017
1 36.45 35.43 34.65 33.9 33.14
# 下面是分成2列,即key为一列,item为一列
>>> df = pd.DataFrame( list(zip(factors.keys(),factors.values())) ,columns=['Year','Factor'])
Year Factor
0 2021 36.45
1 2020 35.43
2 2019 34.65
3 2018 33.90
4 2017 33.14
# 选择记录
>>> df[2:4]
Year Factor
2 2019 346.5
3 2018 339.0
# 新增一行记录 'Year'列=2016 (如果index已存在,则直接修改)
>>> df.loc[5,'Year']=2016
>>> df
Year Factor
0 2021 36.45
1 2020 35.43
2 2019 34.65
3 2018 33.90
4 2017 33.14
5 2016 NaN
# 删除某一行记录, axis=0 为默认值, =0 表示删除行,=1删除列。
>>> df.drop(5,axis=0)
Year Factor
0 2021 36.45
1 2020 35.43
2 2019 34.65
3 2018 33.90
4 2017 33.14
# 增加一列空列
>>> df['memo'] = '' #新增列值为空
>>> df = df.reindex(columns=['Year','Factor','memo']) #新增列值为Nan
Year Factor memo
0 2021 36.45
1 2020 35.43
2 2019 34.65
3 2018 33.90
4 2017 33.14
# 删除某一列,labels 表示列名。axis=1表示删除列。inplace=True,直接修改
>>> df.drop(labels=['memo'],axis=1,inplace=True)
Year Factor
0 2021 36.45
1 2020 35.43
2 2019 34.65
3 2018 33.90
4 2017 33.14
5 2016 NaN
# 针对某一列进行操作,如统一乘10,可以用apply
>>> df.loc[:,'Factor'] = df['Factor'].apply(lambda x: x * 10) # 也可以代入函数 如 lambda x:func(x)
>>> df.loc[:,'Factor'] = [ x * 10 for x in df['Factor']] #这个也可以
>>> df
Year Factor
0 2021 364.5
1 2020 354.3
2 2019 346.5
3 2018 339.0
4 2017 331.4
5 2016 NaN
# pandas read_csv
df = pd.read_csv(csv_path,encoding='utf8',sep=';',header=None,usecols=[0,1,5,6],names=['ID','Desc','Last_Update','Note'], skiprows=[0]).astype('str')
header=None #不要默认的列名
usecols = [0,1,5,6] # 只要第1/2/6/8列,若数据列数不够,则该列为空。
names = ['ID','Desc','Last_Update','Note'] # 自定义的列名,与usecols个数一致。
skiprows=[0] # 跳过第1行,可多行,如第1和2行 = [0,1]
df.astype('str') #将df转成str,或某一列,如 df['ID'].astype('str')
df.drop_duplicates(column_list) # 去重操作,column_list是列表,可多列。
df.values.tolist() # 转成列表,或者 df['ID'].values.tolist()
# 读取大容量csv文件
# chunksize 分片 读取
pd.concat(pd.read_csv(input_path,chunksize=10000,iterator=True, encoding= codetxt ,sep=septxt),ignore_index=True)
#df 合并 : pd.merge(left, right, how, on )
pandas 合并行或列,透视与逆透视 (melt, pivot, concat)
# 统计
>>> df[['age','wgt']].groupby('age',as_index=False).sum()
将age分组,计算所有wgt的和。
sum()可以用其它函数代替,比如count
as_index=False,将分组后的age当成一列,而不是变成index。
默认as_index=True,即age成为index。
没有加sum(),则是个 groupby对象,加了以后变成df
#保存多个工作表到EXCEL
xlsx = pd.ExcelWriter(savepath)
df1.to_excel(xlsx,sheet_name='table1',index=False)
df2.to_excel(xlsx,sheet_name='table2',index=False)
# 统计信息 :describe()后的数据不是df对象,可以加个 to_frame()
>>> df['wgt'].describe().to_frame()
# 两列直接计算并赋值给另一列
>>> df['universe'] = df['wgt'] * df['factor']
# 删除某一列
>>> df.drop(columns=['factor'],inplace=True)
# df字段explode,df中某列的值是列表,经过df.explode(字段) 后,拆成数行。
>>> df
a b
0 A [1, 2, 3]
1 B [4]
2 C [5]
>>> df.explode('b')
a b
0 A 1
0 A 2
0 A 3
1 B 4
2 C 5
# 读取zip压缩文件夹中的某个csv文件 , pd.read_csv的参数
import zipfile
import pandas as pd
def read_Dicc_zip(self,zip_file_path):
_zip = zipfile.ZipFile(zip_file_path)
data = _zip.open(_zip.namelist()[0])
df = pd.read_csv(data,encoding='utf8',sep=';',
header=None,usecols=[0,1,5,6],
names=['ID','Description','Last_Update','Note'],
skiprows=[0]).astype('str')
df.Note=df.Note.str.replace(',',' | ')
df['Last_Update'] = df['Last_Update'].apply(lambda x: x[:10])
return df
>>> 导入数据
pd.read_csv(filename):从CSV文件导入数据
pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
pd.read_sql(query, connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据
>>> 导出数据
df.to_csv(filename):导出数据到CSV文件
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name, connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件
>>> 创建测试对象
pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
pd.Series(my_list):从可迭代对象my_list创建一个Series对象
df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一个日期索引
>>> 查看、检查数据
df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape():查看行数和列数
df.info():查看索引、数据类型和内存信息
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数
>>> 数据选取
df[col]:根据列名,并以Series的形式返回列
df[[col1, col2]]:以DataFrame形式返回多列
s.iloc[0]:按位置选取数据
s.loc['index_one']:按索引选取数据
df.iloc[0,:]:返回第一行
df.iloc[0,0]:返回第一列的第一个元素
df.values[:,:-1]:返回除了最后一列的其他列的所以数据
df.query('[1, 2] not in c'): 返回c列中不包含1,2的其他数据集
>>> 数据清理
df.columns = ['a','b','c']:重命名列名
pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
df.dropna():删除所有包含空值的行
df.dropna(axis=1):删除所有包含空值的列
df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
df.fillna(x):用x替换DataFrame对象中所有的空值
s.astype(float):将Series中的数据类型更改为float类型
s.replace(1,'one'):用‘one’代替所有等于1的值
s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
df.rename(columns=lambda x: x + 1):批量更改列名
df.rename(columns={'old_name': 'new_ name'}):选择性更改列名
df.set_index('column_one'):更改索引列
df.rename(index=lambda x: x + 1):批量重命名索引
>>> 数据处理:Filter、Sort和GroupBy
df[df[col] > 0.5]:选择col列的值大于0.5的行
df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col2, ascending=False):按照列col1降序排列数据
df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max
>>> 数据合并
df1.append(df2):将df2中的行添加到df1的尾部
df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join
>>> 数据统计
df.describe():查看数据值列的汇总统计
df.mean():返回所有列的均值
df.corr():返回列与列之间的相关系数
df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值
df.min():返回每一列的最小值
df.median():返回每一列的中位数
df.std():返回每一列的标准差