文章目录
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] # 返回第一列
注意:
- loc返回的是numpy数组;iloc返回的的DataFrame(Series)
- loc和iloc中输入一个数字时表示取出某一行,当要取出列时参考上面例子
- 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
继续总结…