目录
- 1、读取 csv 文件 df.read_csv
- 2、写入 csv 文件 df.to_csv
- 3、数据帧 pd.DataFrame
- 4、 获取数据帧的形状 df.shape
- 5、查看前 n 行 df.head(n)
- 6、打印列的类型 df.dtypes
- 7、修改列的类型 astype
- 8-9、打印有关 DataFrame 的描述性信息
- 10、 填充 NaN 值 df.fillna
- 11、数据帧的关联 df.merge
- 12、数据帧排序 df.sort_values
- 13、数据帧分组 df.groupby
- 14、重命名列 df.rename
- 15、删除列 df.drop
- 16、增加列
- 17、数据帧过滤-布尔型过滤
- 18、数据帧过滤-之获取某一列
- 19、数据帧过滤-按标签选择 df.loc
- 20、数据帧过滤-按索引选择 df.iloc
- 21、数据帧中对某一列去重
- 22、数据帧中获取某一列去重后的个数
- 23、将函数应用于 DataFrame df.apply
- 24、标记重复行 df.duplicated
- 25、删除重复行 df.drop_duplicates
- 26、寻找值的分布 value_counts
- 27、 重置 DataFrame 的索引 df.reset_index
- 28、查找交叉表 df.crosstab
- 29、透视数据帧
1、读取 csv 文件 df.read_csv
csv 通常是读取 Pandas DataFrame 的最流行的文件格式,你可以使用 pd.read_csv() 方法创建 Pandas DataFrame,类似的函数还有 read_excel,用法如下:
file = "file.csv" | |
df = pd.read_csv(file) | |
print(df) | |
####### out put ########## | |
col col2 col3 | |
1 2 A | |
3 4 B |
2、写入 csv 文件 df.to_csv
将 DataFrame 导出到 csv,类似的函数是 df.to_excel,用法如下:
df.to_csv("file.csv", sep = "|", index = False)
查看 file.csv
!cat file.csv | |
col|col2|col3 | |
|2|A | |
|4|B |
3、数据帧 pd.DataFrame
用来创建 Pandas 的 DataFrame:
data = [[, 2, "A"], | |
[, 4, "B"]] | |
df = pd.DataFrame(data, | |
columns = ["col", "col2", "col3"]) | |
print(df) | |
####### out put ########## | |
col col2 col3 | |
1 2 A | |
3 4 B |
借助这个构造函数,我们还可以把字典转换为 DataFrame:
data = {'col': [1, 2], | |
'col': [3, 4], | |
'col': ["A", "B"]} | |
df = pd.DataFrame(data=data) | |
print(df) | |
####### out put ########## | |
col col2 col3 | |
col col2 col3 | |
1 3 A | |
2 4 B |
4、 获取数据帧的形状 df.shape
df.shape 属性可以获取 DataFrame 的形状,也就是几行几列这样的数据:
print(df) | |
print("Shape:", df.shape) | |
####### out put ########## | |
col col2 col3 | |
col col2 col3 | |
1 3 A | |
2 4 B | |
Shape: (, 3) |
5、查看前 n 行 df.head(n)
数据帧(DataFrame) 会有很多行,通常我们只对查看 DataFrame 的前 n 行感兴趣,这时可以使用 df.head(n) 方法打印前 n 行:
print(df.head()) | |
####### out put ########## | |
col col2 col3 | |
1 2 A | |
3 4 B | |
5 6 C | |
7 8 D | |
9 10 E |
6、打印列的类型 df.dtypes
Pandas 为 DataFrame 中的每一列分配适当的数据类型。使用 dtypes 参数打印所有列的数据类型:
df.dtypes | |
col int64 | |
col int64 | |
col object | |
dtype: object |
7、修改列的类型 astype
如果要更改列的数据类型,可以使用 astype() 方法,如下所示:
df["col"] = df["col1"].astype(np.int8) | |
print(df.dtypes) | |
####### out put ########## | |
col int8 | |
col int64 | |
col object | |
dtype: object |
8-9、打印有关 DataFrame 的描述性信息
这里有两个函数,第一个 df.info():
df.info() | |
####### out put ########## | |
<class 'pandas.core.frame.DataFrame'> | |
RangeIndex: entries, 0 to 9 | |
Data columns (total columns): | |
# Column Non-Null Count Dtype | |
--- ------ -------------- ----- | |
col1 10 non-null int8 | |
col2 10 non-null int64 | |
col3 10 non-null object | |
dtypes: int(1), int8(1), object(1) | |
memory usage: .0+ bytes |
第二个是 df.describe()。
如果要打印每个数值列的平均值、标准偏差、最大值等标准统计信息,就可以这样:
print(df.describe()) | |
###### out put ########## | |
col col2 | |
count .00 10.00 | |
mean .00 11.00 | |
std .06 6.06 | |
min .00 2.00 | |
5.50 6.50 | |
10.00 11.00 | |
14.50 15.50 | |
max .00 20.00 |
10、 填充 NaN 值 df.fillna
假如有这样的 DataFrame:
df = pd.DataFrame([[, 2, "A"], [np.nan, 4, "B"]], | |
columns = ["col", "col2", "col3"]) | |
print(df) | |
####### out put ########## | |
col col2 col3 | |
1.0 2 A | |
NaN 4 B |
里面有 NaN,如果要填充它,可以这样:
df.fillna(, inplace = True) | |
print(df) | |
######## out put ########## | |
col col2 col3 | |
1.0 2 A | |
0.0 4 B |
11、数据帧的关联 df.merge
如果你想用一个连接键合并两个 DataFrame,使用 pd.merge() 方法:
merge 之前:
df = ... | |
df = ... | |
print(df) | |
print(df) | |
######## out put ########## | |
col col2 col3 | |
1 2 A | |
3 4 A | |
5 6 B | |
col col4 | |
A X | |
B Y |
使用 df.merge 后,可以生成新的数据帧
pd.merge(df, df2, on = "col3") | |
######## out put ########## | |
col col2 col3 col4 | |
1 2 A X | |
3 4 A X | |
5 6 B Y |
12、数据帧排序 df.sort_values
排序是 DataFrame 非常典型的操作,我们可以使用 df.sort_values() 方法对 DataFrame 进行排序:
f = pd.DataFrame([[, 2, "A"], | |
[, 8, "B"], | |
[, 10, "B"]], | |
columns = ["col", "col2", "col3"]) | |
print(df.sort_values("col")) | |
######## out put ########## | |
col col2 col3 | |
1 2 A | |
3 10 B | |
5 8 B |
13、数据帧分组 df.groupby
要对 DataFrame 进行分组并执行聚合,使用 Pandas 中的 groupby() 方法,如下所示:
df = pd.DataFrame([[, 2, "A"], | |
[, 8, "B"], | |
[, 10, "B"]], | |
columns = ["col", "col2", "col3"]) | |
df.groupby("col").agg({"col1":sum, "col2":max}) | |
######## out put ########## | |
col col2 | |
col | |
A 2 | |
B 10 |
14、重命名列 df.rename
如果要重命名列标题,请使用 df.rename() 方法,如下所示:
f = pd.DataFrame([[, 2, "A"], | |
[, 8, "B"], | |
[, 10, "B"]], | |
columns = ["col", "col2", "col3"]) | |
df.rename(columns = {"col":"col_A"}) | |
######## out put ########## | |
col_A col col3 | |
1 2 A | |
5 8 B | |
3 10 B |
15、删除列 df.drop
如果要删除数据帧中的某一列,可以这样:
df = pd.DataFrame([[, 2, "A"], | |
[, 8, "B"], | |
[, 10, "B"]], | |
columns = ["col", "col2", "col3"]) | |
print(df.drop(columns = ["col"])) | |
######## out put ########## | |
col col3 | |
2 A | |
8 B | |
10 B |
16、增加列
方法一:使用赋值运算符添加新列
df = pd.DataFrame([[, 2], [3, 4]], | |
columns = ["col", "col2"]) | |
df["col"] = df["col1"] + df["col2"] | |
print(df) | |
######## out put ########## | |
col col2 col3 | |
1 2 3 | |
3 4 7 |
方法二:df.assign()
df = pd.DataFrame([[, 2], [3, 4]], | |
columns = ["col", "col2"]) | |
df = df.assign(col = df["col1"] + df["col2"]) | |
print(df) | |
######## out put ########## | |
col col2 col3 | |
1 2 3 | |
3 4 7 |
17、数据帧过滤-布尔型过滤
如果该行上的条件评估为 True,则选择该行:
df = pd.DataFrame([[, 2, "A"], | |
[, 8, "B"], | |
[, 10, "B"]], | |
columns = ["col", "col2", "col3"]) | |
print(df[df["col"] > 5]) | |
######## out put ########## | |
col col2 col3 | |
5 8 B | |
3 10 B |
18、数据帧过滤-之获取某一列
df["col"] ## or df.col1 | |
######## out put ########## 1 | |
5 | |
3 | |
Name: col, dtype: int64 |
19、数据帧过滤-按标签选择 df.loc
在基于标签的选择中,要求的每个标签都必须在 DataFrame 的索引中。整数也是有效的标签,但它们指的是标签而不是索引位置。
假如有如下 DataFrame:
df = pd.DataFrame([[, 5, 10], | |
[, 8, 6], | |
[, 10, 4]], | |
columns = ["Maths", "Science", "English"], | |
index = ["John", "Mark", "Peter"]) | |
print(df) | |
######## out put ########## | |
Maths Science English | |
John 5 10 | |
Mark 8 6 | |
Peter 10 4 |
我们使用 df.loc 方法进行基于标签的选择:
df.loc["John"] | |
####### | |
Maths | |
Science | |
English | |
Name: John, dtype: int | |
df.loc["Mark", ["Maths", "English"]] | |
####### | |
Maths | |
English | |
Name: Mark, dtype: int |
但是在df.loc[]中,不允许使用索引来过滤 DataFrame,如下图:
20、数据帧过滤-按索引选择 df.iloc
以 19 里面的数据帧为例,使用 df.iloc 可以用索引:
df.iloc[] | |
####### | |
Maths | |
Science | |
English | |
Name: John, dtype: int |
21、数据帧中对某一列去重
df = pd.DataFrame([[, 2, "A"], | |
[, 8, "B"], | |
[, 10, "A"]], | |
columns = ["col", "col2", "col3"]) | |
df["col"].unique() | |
######## out put ########## | |
array(['A', 'B'], dtype=object) |
22、数据帧中获取某一列去重后的个数
df["col"].nunique() | |
######## out put ########## |
23、将函数应用于 DataFrame df.apply
非常实用:
def add_cols(row): | |
return row.col + row.col2 | |
df = pd.DataFrame([[, 2], | |
[, 8], | |
[, 9]], | |
columns = ["col", "col2"]) | |
df["col"] = df.apply(add_cols, axis=1) | |
print(df) | |
######## out put ########## | |
col col2 col3 | |
1 2 3 | |
5 8 13 | |
3 9 12 |
还可以将方法应用于单个列,如下所示:
def square_col(num): | |
return num** | |
df = pd.DataFrame([[, 2], | |
[, 8], | |
[, 9]], | |
columns = ["col", "col2"]) | |
df["col"] = df.col1.apply(square_col) | |
print(df) | |
######## out put ########## | |
col col2 col3 | |
1 2 1 | |
5 8 25 | |
3 9 9 |
24、标记重复行 df.duplicated
你可以使用 df.duplicated() 方法标记所有重复的行
df = pd.DataFrame([[, "A"], | |
[, "B"], | |
[, "A"]], | |
columns = ["col", "col2"]) | |
df.duplicated(keep=False) | |
######## out put ########## True | |
False | |
True | |
dtype: bool |
25、删除重复行 df.drop_duplicates
可以使用 df.drop_duplicates() 方法删除重复的行,如下所示:
df = pd.DataFrame([[, "A"], | |
[, "B"], | |
[, "A"]], | |
columns = ["col", "col2"]) | |
print(df.drop_duplicates()) | |
######## out put ########## | |
col col2 | |
1 A | |
2 B |
26、寻找值的分布 value_counts
要查找列中每个唯一值的频率,请使用 df.value_counts() 方法:
df = pd.DataFrame([[, "A"], | |
[, "B"], | |
[, "A"]], | |
columns = ["col", "col2"]) | |
print(df.value_counts("col")) | |
######## out put ########## | |
col | |
A | |
B | |
dtype: int |
27、 重置 DataFrame 的索引 df.reset_index
要重置 DataFrame 的索引,请使用 df.reset_index() 方法:
df = pd.DataFrame([[, 5, 10], | |
[, 8, 6], | |
[, 10, 4]], | |
columns = ["col", "col2", "col3"], | |
index = [, 3, 1]) | |
print(df.reset_index()) | |
######## out put ########## | |
index col col2 col3 | |
2 6 5 10 | |
3 5 8 6 | |
1 3 10 4 |
要删除旧索引,请将 drop=True 作为参数传递给上述方法:
df.reset_index(drop=True) | |
######## out put ########## | |
col col2 col3 | |
6 5 10 | |
5 8 6 | |
3 10 4 |
28、查找交叉表 df.crosstab
要返回跨两列的每个值组合的频率,请使用 pd.crosstab() 方法:
df = pd.DataFrame([["A", "X"], | |
["B", "Y"], | |
["C", "X"], | |
["A", "X"]], | |
columns = ["col", "col2"]) | |
print(pd.crosstab(df.col, df.col2)) | |
######## out put ########## | |
col X Y | |
col | |
A 0 | |
B 1 | |
C 0 |
29、透视数据帧
数据透视表是 Excel 中常用的数据分析工具。与上面讨论的交叉表类似,Pandas 中的数据透视表提供了一种交叉制表数据的方法。
假如 DataFrame 如下:
df = ... | |
print(df) | |
Name Subject Marks John Maths 6 | |
Mark Maths 5 | |
Peter Maths 3 | |
John Science 5 | |
Mark Science 8 | |
Peter Science 10 | |
John English 10 | |
Mark English 6 | |
Peter English 4 |
使用 pd.pivot_table() 方法,可以将列条目转换为列标题:
pd.pivot_table(df, | |
index = ["Name"], | |
columns=["Subject"], | |
values='Marks', | |
fill_value=) | |
######## out put ########## | |
Subject English Maths Science | |
Name | |
John 6 5 | |
Mark 5 8 | |
Peter 3 10 |