pandas

pandas教程

1.DataFrame

1.1 直接创建

df = pd.DataFrame(np.random.randn(4,4), index=list("abcd"), columns=list("ABCD"))
print(df)

result:

      A         B         C         D 
a  0.127592 -0.649874  1.022716  2.186142
b -0.505211 -0.444572  0.642117  1.261211
c -1.561344  1.130130  1.531596 -1.702738
d  1.278027 -0.737045  0.537977  0.022442

也可以直接输入数据

df2=pd.DataFrame([[1,2,3,4],[2,3,4,5],
                  [3,4,5,6],[4,5,6,7]],
                 index=list('ABCD'),columns=list('ABCD'))

1.2使用字典创建

dic1={'name':['小明','小红','狗蛋','铁柱'],'age':[17,20,5,40],'gender':['男','女','女','男']}
df3=pd.DataFrame(dic1)

result:

	    	name  age    gender
		0   小明   17      男
		1   小红   20      女
		2   狗蛋    5      女
		3   铁柱   40      男

2.查看筛选数据

2.1 查看数据类型

使用dtypes方法可以查看各列的数据类型

print(df3.dtypes)

name      object
age        int64
gender    object
dtype: object

2.2查看头尾数据

使用head可以查看前几行的数据,默认的是前5行,不过也可以自己设置。使用tail可以查看后几行的数据,默认也是5行,参数可以自己设置

print(df3.head(2))

    name  age gender
0   小明   17      男
1   小红   20      女

print(df3.tail(2))

    name  age gender
2   狗蛋    5      女
3   铁柱   40      男

###2.3查看行名和列名
index查看行名,columns查看列名

df3.index
>>>RangeIndex(start=0, stop=4, step=1)
	[Finished in 0.8s]

df.index
>>>Index(['a', 'b', 'c', 'd'], dtype='object')
	[Finished in 0.9s]

df.columns
>>>Index(['A', 'B', 'C', 'D'], dtype='object')

2.4查看数值

使用values可以查看DataFrame里的数据值,返回的是一个数组

查看所有的数据值

df3.values
>>>[['小明' 17 '男']
 ['小红' 20 '女']
 ['狗蛋' 5 '女']
 ['铁柱' 40 '男']]

查看某一列(行)所有的数据值

df3['name'].values
>>>['小明' '小红' '狗蛋' '铁柱']

使用loc或者iloc查看数据值;区别是loc是根据行名,iloc是根据数字索引(也就是行号)

df.loc['a'] # 输出a行的所有值
df.loc[:,"A"] # 输出A列的所有值
df.iloc[1]  # 返回第一行,索引从零开始
df.iloc[:,1] # 返回第一列

注意:

  1. loc返回的是numpy数组;iloc返回的的DataFrame(Series)
  2. loc和iloc中输入一个数字时表示取出某一行,当要取出列时参考上面例子
  3. loc的索引为行名,iloc为行号

2.5 查看基本情况

df.info()
df.describe()

2.6 其他总结

展示df的前3行
df.iloc[:3]
# 方法二
#df.head(3)

取出df的animal和age列
df.loc[:, ['animal', 'age']]
# 方法二
# df[['animal', 'age']]

取出索引为[3, 4, 8]行的animal和age列
df.loc[df.index[[3, 4, 8]], ['animal', 'age']]

取出age值大于3的行
df[df['age'] > 3]

取出age值缺失的行
df[df['age'].isnull()]

取出age在2,4间的行(不含)
df[(df['age']>2) & (df['age']<4)]
#df[df['age'].between(2, 4)]

f行的age改为1.5
df.loc['f', 'age'] = 1.5

计算visits的总和
df['visits'].sum()

在df中插入新行k,然后删除该行
#插入
df.loc['k'] = [5.5, 'dog', 'no', 2]
# 删除
df = df.drop('k')

计算df中每个种类animal的数量
df['animal'].value_counts()

先按age降序排列,后按visits升序排列
df.sort_values(by=['age', 'visits'], ascending=[False, True])

将priority列中的yes, no替换为布尔值True, False
df['priority'] = df['priority'].map({'yes': True, 'no': False})

将animal列中的snake替换为python
df['animal'] = df['animal'].replace('snake', 'python')

3.基本操作

3.1转置

df3.T
         0     1    2     3
name    小明  小红  狗蛋  铁柱
age      17   20    5    40
gender   男   女    女    男

3.2统计性描述

df3.describe()
返回统计信息如每列的均值方差最小值等

3.3计算

使用sum默认对每列求和,sum(1)为对每行求和

df3.sum()
>>>name      小明小红狗蛋铁柱
	age             82
	gender        男女女男
	dtype: object

df3.sum(1)
>>> 0    17
	1    20
	2     5
	3    40

可以看出:若一行(列)里面是字符串,将字符串连接;若一行中,有字符串有数值则只计算数值

调用函数计算

	df3.apply(lambda x:x*2) #对df3中每个数字都平方,也可以指定某一行列进行用函数计算

3.4新增

扩充列可以直接像字典一样,列名对应一个list,但是注意list的长度要跟index的长度一致

df["E"]=[90,10,12,11]
>>>          A         B         C         D   E
	a  1.715581  0.005838 -0.774967  1.631021  90
	b  0.028957  0.527853  1.470121 -1.944932  10
	c  0.912794 -0.600530  1.898356  1.334174  12
	d -0.590758 -0.535521 -1.086395 -0.862395  11

使用insert,使用这个方法可以指定把列插入到第几列,其他的列顺延

df.insert(0,"F",[90,10,12,11])
>>>
    F         A         B         C         D
a  90 -1.250698  1.218611 -0.554146  0.092241
b  10 -0.542221  0.054207 -0.473884 -1.150850
c  12  0.818818 -1.495873  1.162350  0.747261
d  11  0.018952  0.162302  0.323193 -0.210869

3.5合并

使用join可以将两个DataFrame合并,但只根据行列名合并,并且以作用的那个DataFrame的为基准。如下所示,新的df7是以df2的行号index为基准的

df6=pd.DataFrame(['my','name','is','a'],index=list('ACDH'),columns=list('G'))
df7=df2.join(df6)

result:

4.一些函数

4.1 pd.concat()

pd.concat((df1,df2..),axis=0)
args:
	axis:需要合并连接的轴,0是竖直连接,1是横着连接

注意事项如下:

df1:
  		name  age
	0   小明   17
	1   小红   20 
df2:
		name  age
	4   狗蛋    5
	5   铁柱   40
pd.concat((df1,df2),axis=1):
	  	name   age name   age
	0   小明  17.0  NaN   NaN
	1   小红  20.0  NaN   NaN
	4  NaN   NaN   狗蛋   5.0
	5  NaN   NaN   铁柱  40.0

4.2 pd.dummies()

get_dummies 是利用pandas实现one hot encode的方式

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)
args:
	data:可以是数组类型,Series类型,DataFrame类型
	prefix:可以字符串,字符串列表,或字符串的字典类型,默认为None
	drop_first:布尔型,默认为False,指是否删除第一列


例1:
s=pd.Series(list('abca'))
s0=pd.get_dummies(s)
print(s)
print(s0)
'''
0    a
1    b
2    c
3    a
dtype: object
   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0
'''

例2:dummy_na参数
s1=['a','b',np.nan]
print(s1)
print(pd.get_dummies(s1))
print(pd.get_dummies(s1,dummy_na=True))
'''
['a', 'b', nan]
   a  b
0  1  0
1  0  1
2  0  0
   a  b  NaN
0  1  0    0
1  0  1    0
2  0  0    1
'''

例3: prefix参数
df=pd.DataFrame({'A':['a','b','a'],'B':['b','a','c'],'C':[1,2,3]})
print(df)
print(pd.get_dummies(df))
print(pd.get_dummies(df,prefix=['col1','col2']))
'''
   A  B  C
0  a  b  1
1  b  a  2
2  a  c  3
   C  A_a  A_b  B_a  B_b  B_c
0  1    1    0    0    1    0
1  2    0    1    1    0    0
2  3    1    0    0    0    1
   C  col1_a  col1_b  col2_a  col2_b  col2_c
0  1       1       0       0       1       0
1  2       0       1       1       0       0
2  3       1       0       0       0       1
'''
 
例4:drop_first参数
print(pd.get_dummies(pd.Series(list('abcaa'))))
print(pd.get_dummies(pd.Series(list('abcaa')),drop_first=True))
'''
   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0
4  1  0  0
   b  c
0  0  0
1  1  0
2  0  1
3  0  0
4  0  0
'''

例5:dtype参数	 
print(pd.get_dummies(pd.Series(list('abx')),dtype=float))
'''
     a    b    x
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  0.0  0.0  1.0
'''


df=pd.DataFrame([['green','A'],
                 ['red','B'],
                 ['blue','A']])
df.columns=['color','class']
print(df)
print(pd.get_dummies(df))
'''
   color class
0  green     A
1    red     B
2   blue     A

   color_blue  color_green  color_red  class_A  class_B
0           0            1          0        1        0
1           0            0          1        0        1
2           1            0          0        1        0

例6:指定列
print(pd.get_dummies(df.color))
'''
   blue  green  red
0     0      1    0
1     0      0    1
2     1      0    0
'''

例7:将指定列进行get_dummies后合并到元数据中
print(df.join(pd.get_dummies(df.color)))
'''
   color class  blue  green  red
0  green     A     0      1    0
1    red     B     0      0    1
2   blue     A     1      0    0
'''

4.3 DataFrame.fillna(val, inplace)

对NaN值填充

DataFrame.fillna(val, inplace)
args:
	val:将nan值填充的零个值
	inplace: True表示直接修改原对象,默认为False

通过字典填充不同的常数

df1.fillna({0:10,1:20,2:30})
其中0,1,2代表列名,10,20,30代表每列将NaN值换成的数值

4.4 dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

参考链接:Python-pandas的dropna()方法-丢弃含空值的行、列
axis:轴;0或’index’,表示按行删除;1或’columns’,表示按列删除。默认为0

how:筛选方式。‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列。默认为any

thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非Na元素数量小于这个值,就删除该行/列。

subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。

inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。

5.进阶操作

有一列整数列A的DatraFrame,删除数值重复的行

df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
print(df)
df1 = df.loc[df['A'].shift() != df['A']]
# 方法二
# df1 = df.drop_duplicates(subset='A')
print(df1)

保存文件

df.to_csv(‘path/Result.csv’,header=0) #不保存列名
df.to_csv(‘path/Result1.csv’,index=0) #不保存行索引

todo
继续总结…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值