import pandas as pdpandas总结
载入CSV文件,并展示
df = pd.read_csv('1ttdata.csv')
df
展示元数据
df.info() #展示初始化后的很多基本信息,包括下面举例的几个 type(df) #展示类型 df.index #展示RangeIndex start=xxx, stop=xxx #pandas.core.frame.DataFrame
支持的读取方式
df.head()
df.tail()
#默认是5条,可以指定
df.values[0]
#展示指定行的内容
df.keys()
#展示有哪些key
df['XXXkey']
df['Age'].head(10)[:5]
#显示某一列,支持函数head等,也支持列表切割[:5]
dg = df.set_index('Name')
#设置索引为那一列,或者自定义
#通过一个volume或者index
dg = df.set_index('Name')
test1 = dg['age']
test1['Braund, Mr. Owen Harris']
#可以通过名字获取年龄了
test1.mean()
#获取平均值
test1.min()
#获取最小值
test1.max()
#获取最大值
自定义DataFrame
data = {'country':['aaa','bbb','ccc'],
'population':[10,12,14]}
df_data = pd.DataFrame(data)
df_data
df_date.describe()
#获得数据的统计,所有数字的列,都会进行计算平均值,最大值,最小值,标准差,方差等
显示图表的5行,并展示2到3列
df.iloc[:5,1:3]
设置Name列为索引
df = df.set_index('Name')
df.loc['Cumings, Mrs. John Bradley (Florence Briggs Thayer)']
#根据这个名字去查找全信息
df.loc['Cumings, Mrs. John Bradley (Florence Briggs Thayer)','Age']
#拿出具体的值
根据索引拿出部分
df.loc['Cumings, Mrs. John Bradley (Florence Briggs Thayer)':'Allen, Mr. William Henry'] #打印出从A名称到B名称的值 df.loc['Heikkinen, Miss. Laina','Age'] = 50 #对值赋值 df['Age'] > 30 #年龄大于 30 的 df.loc[df['Sex'] == 'male' ,'Age'].mean() #查看平均值 df.iloc[1] #查看第二行的数据 t1.loc[1,'Age'] = 50 #第二行的数据修改 t1 = df.copy() #深度 拷贝
打印出名称和年龄
df = pd.DataFrame({'name':['A','B','C','A','A','B'],
'age':[8,7,9,6,5,4]})
for name in ['A','B','C']:
print(name,df[df['name'] == name]) #还可以.sum 或者 .mean
根据性别分类分别去求年龄的平均值
df.groupby('Sex')['Age'].mean()
自定义数组
df = pd.DataFrame([[1,2,3],[4,5,6]],index = ['a','b'],columns = ['A','B','C']) #横坐标为a和b,竖坐标为A B C df.sum() #按列求和 df.sum( axis = 1 ) #按行求和 df.sum(axis = 'columns') #按定义的key值求和 df['Age'].value_counts() #求协方差 df.cov() #求相关系数 df.corr() #降序查看所有年龄的数量 df['Age'].value_counts() #以升序进行排序 df['Age'].value_counts(ascending = True) #默认分成5组进行统计 df['Age'].value_counts(ascending = True, bins=5) #总的计数,None的不计入 df['Age'].count() #增加一行值,并增加列的key s1 = df.append(s2,ignore_index=True) #删除一个key,DataFrame结构,单线条的话就是删除k的索引的所有 del s1['k'] #删除一个索引在的所有数据并输出 s1.drop(891) #删除一个索引并保存 s1.drop(2,inplace = True) #DateFrame结构有index的情况下,想用数字去调取某一行,需要用iloc去做一下 df.iloc[0] #用设置的index访问则用loc df.loc['a']改操作
df.loc['a']['A'] = 150 #注意,小a是index,大A是columns
进行拼接
df3 = pd.concat([s1,s2],axis=1)
增加列,也可以,axis=1 去拼接
df['test'] = [xxx,xxx,xxx,...]
#dataF删除列
del df['Age']
#dataF删除行
df3.drop('h',axis=0,inplace = True)
#删除多列
df3.drop(['Age','Cabin'],axis=1) #inplace不写默认为False,只输出,不更改原值
构造一个多维表
left = pd.DataFrame({'key':['KO','K1','K3'],
'A':['A1','A2','A3'],
'B':['B1','B2','B3']})
right = pd.DataFrame({'key':['KO','K1','K3'],
'C':['C1','C2','C3'],
'D':['D1','D2','D3']})
pd.merge(left,right)
#将两个表合起来
#要求有共同的Key下值一致
pd.merge(left,right,on='key')
#以key为主键进行合并,如果有key2当作是不同的东西
#例如
'''
key A B key2_x C D key2_y
0 KO A1 B1 K0 C1 D1 K0
1 K1 A2 B2 K2 C2 D2 K2
2 K3 A3 B3 K3 C3 D3 K3
'''
pd.merge(left,right,on=['key','key2'])
#也可以多key作为key,这样就没有重复的列了
特殊情况
left = pd.DataFrame({'key':['KO','K1','K3'],
'A':['A1','A2','A3'],
'B':['B1','B2','B3'],
'key2':['K0','K2','K3']})
right = pd.DataFrame({'key':['KO','K1','K3'],
'C':['C1','C2','C3'],
'D':['D1','D2','D3'],
'key2':['K0','K2','K4']})
#有key2有不一致的地方
pd.merge(left,right,on=['key','key2'])
#如果key加入了key2,那么key2有key没有 ,或者key有key2没有的,就不显示
pd.merge(left,right,on=['key','key2'],how='outer')
#增加outer,增加了外键。不一样的地方会补全 none 并输出
#how 还可以添加,left 或者 right ,来确定是以坐标为基准,还是右表为基准
'''
key A B key2 C D
0 KO A1 B1 K0 C1 D1
1 K1 A2 B2 K2 C2 D2
2 K3 A3 B3 K3 NaN NaN
3 K3 NaN NaN K4 C3 D3
'''
pd.merge(left,right,on=['key','key2'],how='outer',indicator = True)
#加一个参数,显示这一行是 所有表中都有 还是某个表独有
pd.set_option('display.max_rows',100)
#设置输出的最多都少行
pd.Series(index = range(0,100) )
#生成一个100行的NaN数据
pd.set_option('display.max_columns',30)
#设置最多打印多少列
a = pd.DataFrame(columns = range(0,40))
#生成0-40个列
pd.get_option('display.max_colwidth')
#显示最多显示多宽
pd.Series(index = ['A'],data=['t'* 60])
#写一个数据测试一下
pd.get_option('display.precision')
#显示小数点后最多多少位
pd.set_option('display.precision',10)
#设置小数点后显示多少位
数据透视表
a.pivot(index = 'A',columns = 'C',values = 'D') #对一个表,以 C 列为组分类,再分出A 为 index , 计算 D 的总和。 #例如 C 为每个月的tag #A 为每项支出的类型 #D 为花费的金额 #得出的值可以继续计算 #例如 a.sum(axis = 0)
生成表格
df.pivot_table(index = 'Sex',columns='Pclass',values='Fare') df.pivot_table(index = 'Sex',columns='Pclass',values='Fare',aggfunc='mean') #平均数和上面默认的结果一样 df.pivot_table(index = 'Sex',columns='Pclass',values='Fare',aggfunc='count') #计数 pd.crosstab(index = df['Sex'],columns = df['Pclass']) #计数,和上面的计数结果一样
df['Underaged'] = df['Age'] <= 18 #未成年设置一列,分为True和False df.pivot_table(index = 'Underaged',columns='Sex',values='Survived',aggfunc='sum') #根据未成年的索引,分出性别。求获救的数量 df.pivot_table(index = 'Underaged',columns='Pclass',values='Fare',aggfunc='count') #根据未成年为索引,class为列,求出每层甲板的未成年的数量 df[df['Underaged']] #打印出所有未成年 a = df[df['Underaged']] a[a['Survived'] == 1] #打印出所有获救的未成年pandas时间和datetime时间的区别
a = datetime.datetime(year=2020,month=12,day=24,hour=10,minute=30)
b = pd.Timestamp('2020-12-23-10:30')
#访问方式一致
a.day
b.day
#pd的时间增加方式,增加 5 秒
b + pd.Timedelta('50 0000 0000')
#pd的时间增加5分
b + pd.Timedelta('5 minute')
#将字符串类型转换为时间类型
s = pd.Series(['2017-11-24 00:00:00','2017-11-25 00:00:00','2017-11-26 00:00:00'])
ts = pd.to_datetime(s)
'''
0 2017-11-24
1 2017-11-25
2 2017-11-26
dtype: datetime64[ns]
'''
ts.dt.day
#调取日的时间
a = list(ts.dt.day)
#将结果装入列表
pandas时间的对时间表格的使用
pd.Series(pd.date_range(start='2022-5-12',periods = 10,freq = '24H')) #date_range 快速生成时间,10个,每个间隔24小时
data = pd.read_csv('flowdata.csv')
data['Time'] = pd.to_datetime(data['Time'])
#将读进来的时间转变为date类型
data = pd.read_csv('flowdata.csv',index_col = 0 ,parse_dates = True)
#如果就是一个时间序列数据,可以直接把他转换为时间序列
data[pd.Timestamp('2012-01-01 09:00'):pd.Timestamp('2012-01-01 19:00')]
#时间序列数据可以通过切片去获取数据
data['2012-01':'2012-02']
#获取一月到二月的信息
data[data.index.month == 1]
#具体的月
data[(data.index.day == 1) & (data.index.month == 1)]
#多条件获取信息,每年的一月一号信息 支持大于小于号
data.resample('D').mean()
#求每天的平均值
data.resample('3D').max()
#3天一统计
%matplotlib notebook
#开头加这个来说明可以允许画图
data.resample('M').mean().plot()
#将得出的数据画图的形式,展示出来
condas常用 的命令
进行排序
data.sort_values(by=['group','data'],ascending = [False,True]) #以group为倒序,以data为正序 data.sort_values(by='data') #以一个为核心进行排序 data.drop_duplicates().count() #去掉完全重复的数据 data.drop_duplicates(subset='group') #以group为唯一,去掉所有重复的group
#data apply 函数可以对每个数据都执行相同的操作
def food_map(series):
if series['group'] == 'a':
return 'A'
elif series['group'] == 'b':
return 'B'
data['food_map'] = data.apply(food_map,axis = 'columns')
data
#每一行数据都逐一输出 data.apply(print,axis = 'columns')
对数据快速转换
Upper_dict = {
'通州':'河北',}
'廊坊':'河北',
'朝阳':'北京'
}
#写一个对照表
data['new_flat'] = data['flat'].map(Upper_dict)
#生成一个新列,根据字典对照,进行修改后的新列
df.assign(ration = df['data1']/df['data2'])
#增加一列,命名为ration,值为其他的数据计算结果。
df.drop('ration',axis='columns',inplace=True)
#删除索引为ration的列
ages = [15,18,20,21,22,34,41,52,53,63,79] bins = [10,20,30,40,50,90] bins_res = pd.cut(ages,bins) # 判断 ages 在哪个区间 bins_res ''' outs: [(10, 20], (10, 20], (10, 20], (20, 30], (20, 30], ..., (40, 50], (50, 90], (50, 90], (50, 90], (50, 90]] Length: 11 Categories (5, interval[int64]): [(10, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 90]] ''' bins_res.codes #判断在哪个区间 ''' outs: array([0, 0, 0, 1, 1, 2, 3, 4, 4, 4, 4], dtype=int8) ''' pd.cut(ages,[10,30,50,80]).codes #也可以直接传区间数字 ''' array([0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2], dtype=int8) ''' #也可以 自己 定义标签 group_names = ['youth','old'] a = pd.cut(ages,[10,20,80],labels=group_names) pd.value_counts(a) #out ''' old 8 youth 3 dtype: int64 '''condas 缺失值的 应用
df = pd.DataFrame([range(3),[0, np.nan ,0], [0,0,np.nan],range(3) ]) #生成几个含有NaN的 dataframe 的表 df.isnull() #判断哪个 位置 有null df.isnull().any() #判断哪一列有缺失值 df.isnull().any(axis = 1) #判断哪一行有缺失值 df[df.isnull().any(axis=1)] #通过回传的方式,把True的行打印出来,也就是把有缺失值的行打印出来
0 1 2
0 0 1.0 2.0
1 0 NaN 0.0
2 0 0.0 NaN
3 0 1.0 2.0
df = pd.DataFrame({'A':['foo','foo','foo','bar',
'foo','bar','foo','bar'],
'B':['one','two','one','two',
'one','two','one','one'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
df.groupby(['A','B']).count()
#以两个值为key
s = pd.Series([1,2,3,4,3,2],[8,7,6,6,4,5])
grouped = s.groupby(level = 0,sort = False )
grouped.count()
grouped.sum()
grouped.last()
grouped.first()
#可以使用grouped进行对数据操作
修改索引的名称
df.groupby(['X']).get_group('A')
#只关注X索引列中为A的数据
index = pd.MultiIndex.from_arrays(arrays,name = ['first','second'])
s = pd.Series(np.random.randn(8),index = index )
#设置指定的索引
s.groupby(level = 'first')
#关注first的索引的数据,并打印
进行细化计算
groupd = df.groupby(['A','B']) #可以+ ,as_index False 一行一行打印,不合并输出
groupd.aggregate[np.sum]
#以 A,B 为键,求 sum 和的操作
#
df.groupby(['A','B']).sum().reset_index()
#另一种显示的方法和上边的结果一致
grouped.describe().head()
#在grouped基础上可以多种属性一下计算出来
#可以自定义显示哪些数据
grouped = df.groupby('A')
grouped['C'].agg([np.sum,np.mean,np.std])
#以A 为索引,对关于A 的 C 的值计算出多个值



