系列文章目录:
python数据分析(一)——series和读取外部数据
python数据分析(三)——pandas缺失值处理
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录- 一、DataFrame创建
- 二、动手实例
- 1. 取次数最高的前几个名字
- 2. 取行或者列
- 3. 布尔索引
- 4. 字符串方法
- 三、loc
一、DataFrame创建
代码如下(示例):
In [5]: pd.DataFrame(np.arange(12).reshape(3,4)) Out[5]: 0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11
DataFrame对象有行索引,也有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表明不同列,纵向索引,叫columns,1轴,axis=1
代码如下(示例):
In [6]: t1 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) In [7]: t1 Out[7]: w x y z a 0 1 2 3 b 4 5 6 7 c 8 9 10 11
问题一:DataFrame和Series有什么关系?
回答一:DataFrame是Series的容器,取其中任意一行或者任意一列都是Series
代码如下(示例):
In [8]: t2 = {"name":["xiaoshen","xiaoli"],"age":[20,21],"tel":[10086,10010]} # 键变成列索引 In [9]:pd.DataFrame(t2) Out[9]: name age tel 0 xiaoshen 20 10086 1 xiaoli 21 10010
DataFrame的基础属性:
- t.shape # 行数 列数
- t.dtypes # 列数据类型
- t.ndim # 数据维度
- t.index # 行索引
- t.columns # 列索引
- t.values # 对象值,二维ndarray数组
DataFrame整体情况查询:
- t.head(3) # 显示头部几行,默认5行
- t.tail(3) # 显示末尾几行,默认5行
- t.info() # 相关信息概览:行数、列数、列索引、列非空值个数、列类型、行类型、内存占用
- t.describe() # 快速综合统计结果:计数、均值、标准差、最大值、四分位数、最小值
回到之前读取狗名字统计的数据上,尝试一下刚刚的方法
如何知道使用次数最高的前几个名字是什么呢?
df.sort_values(by=“Count_AnimalName”, ascending=False)
代码如下(示例):
import pandas as pd # pandas读取csv中的文件 dogname = pd.read_csv(".../dogNames2.csv") # print(dogname.head()) # print(dogname.info()) # dataframe中排序的方法 dogname_10=dogname.sort_values(by = "Count_AnimalName", ascending=False) print(dogname_10[:10])2. 取行或者列
问题一:刚刚知道了如何给数据按照某一行或者列排序,那么想单独研究使用次数前100的数据,应该如何做?
df.sorted = df.sort_values(by=“Count_AnimalName”)
df.sorted[:100]
如果数据有10列,想按照其中第1,第3,第8列排序,怎么办?(看ipythpn的帮助文档)
问题二:具体要选择某一列该怎么选择呢?df[“Count_AnimalName”]
问题三:要同时选择行和列该怎么办?
df[:100] [“Count_AnimalName”]
dogname_10[“Row_Labels”][:10]和dogname_10[:10][“Row_Labels”]都可
代码如下(示例):
# pandas取行或者取列的注意点 # 一、方括号写数字,表示取行,对行进行操作 print(dogname_10[:10]) # 二、写字符串,表示的列索引,对列进行操作 print(dogname_10["Row_Labels"][:10]) print(type(dogname_10["Row_Labels"])) # series类型3. 布尔索引
- & 且
- | 或
注意点:
不同的条件之间需要用括号括起来
问题一:假如想找到所有使用次数超过800的狗名字,应该怎么选择?
dogname[dogname[“Count_AnimalName”]>800]
问题二:假如想找到所有使用次数超过800小于1000的狗名字,应该怎么选择?
dogname[(800 问题三:假如想找到所有使用次数小于800或者大于1000的狗名字,应该怎么选择? dogname[(dogname[“Count_AnimalName”]<800)|(1000 问题四:想找到所有的使用次数超过700并且名字的字符串长度大于4的狗的名字,应该怎么选择? dogname[(dogname[“Count_AnimalName”]>700)&(dogname[“Row_Labels”].str.len()>4)] 更多的经过pandas优化过的选择方式: 代码如下(示例):
4. 字符串方法
三、loc
In [21]: t = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
In [22]: t
Out[22]:
w x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
In [23]: t.loc["a","z"]
Out[23]: 3
In [24]: t.loc["a",:]
Out[24]:
w 0
x 1
y 2
z 3
Name: a, dtype: int64
In [25]: t.loc["a"]
Out[25]:
w 0
x 1
y 2
z 3
Name: a, dtype: int64
In [28]: t.loc[:,"y"]
Out[28]:
a 2
b 6
c 10
Name: y, dtype: int64
In [30]: t.loc[:,["y","z"]]
Out[30]:
y z
a 2 3
b 6 7
c 10 11
In [31]: t.loc[["a","b"],["y","z"]]
Out[31]:
y z
a 2 3
b 6 7
# 冒号在loc里面是闭合的,会选择到冒号后面的数据
In [33]: t.loc["a":"c",["y","z"]]
Out[33]:
y z
a 2 3
b 6 7
c 10 11
In [36]: t.iloc[1,:]
Out[36]:
w 4
x 5
y 6
z 7
Name: b, dtype: int64
In [37]: t.iloc[:,2]
Out[37]:
a 2
b 6
c 10
Name: y, dtype: int64
In [38]: t.iloc[:,[2,1]]
Out[38]:
y x
a 2 1
b 6 5
c 10 9
In [39]: t.iloc[[0,2],[2,1]]
Out[39]:
y x
a 2 1
c 10 9
In [41]: t.iloc[1:3,0:2]
Out[41]:
w x
b 4 5
c 8 9
In [42]: t.iloc[1:3,0:2] = 20
In [43]: t
Out[43]:
w x y z
a 0 1 2 3
b 20 20 6 7
c 20 20 10 11
In [44]: t.iloc[1:3,0:2] = np.nan
In [45]: t
Out[45]:
w x y z
a 0.0 1.0 2 3
b NaN NaN 6 7
c NaN NaN 10 11