Pandas新手教程
pandas - Python Data Analysis Library
Getting started tutorials ; pandas 2.1.1 documentation
数据类型
DataFrame
1 2
| df = pd.DataFrame({"列名": [列数据]})
|
DataFrame是二维数据结构,可以存储表形式的数据
Series
1 2 3 4
| df["列名"]
column_data = pd.Series([列数据], name="列名")
|
Series是DataFrame的一列,没有行名和列名
DataFrame和Series的一些统计功能
1 2 3 4 5 6
| df.describe() df.count() df.mean() df.std() df.max() df.min()
|
表格形式数据的读写
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| data = pd.read_csv("data.csv")
data.head(8)
data.tail(10)
data.shape
data.dtypes
data.to_excel("data.xlsx", sheet_name="data", index=False)
data.info()
|
DataFrame数据筛选
1 2 3 4 5 6 7 8 9 10 11 12 13
| data[["列名", ...]]
data[data["列名"] > 6] data[data["列名"].isin([2, 3])] data[(data["列名"] == 2) | (data["列名"] == 3)] data[data["列名"].notna()]
data.loc[data["列名"] > 6, "列名"] data.iloc[2:8, 3:9]
data.loc[data["列名"] == 6, "列名"] = "value" data.iloc[0:3, 3] = "value"
|
画图
1 2 3 4 5 6
| import matplotlib.pyplot as plt data.plot() data["列名"].plot() data.plot(x="列名1", y="列名2") data.plot.box() data.plot.area(subplots=True)
|
pandas创建的plot对象是Matplotlib,因此适用Matplotlib的所有功能,如下
1 2 3 4 5
| fig, axs = plt.subplots(figsize=(12, 4)) data.plot.area(ax=axs) axs.set_ylabel("y轴标签") fig.savefig("图片名.png") plt.show()
|
从现有列中创建新列
1 2 3 4 5
| data["新列名"] = data["原列名"] * num data["新列名"] = data["原列名1"] / data["原列名2"] data_renamed = data.rename(columns={"原列名": "新列名",}, rows={"原行名": "新行名"}) data_renamed = data.rename(columns=str.lower)
|
计算统计数据
聚合统计数据
1 2 3 4 5
| data["列名"].mean() data[["列名1", "列名2"]].median() data[["列名1", "列名2"]].describe() data.agg({"列名1": ["min", "max", "median", "skew"], "列名2": ["min", "max", "median", "mean"]})
|
聚合按类别分组的统计信息
1 2 3 4
| data[["列名1", "列名2"]].groupby("列名1").mean() data.groupby("列名").mean(numeric_only=True) data.groupby("列名1")["列名2"].mean() data.groupby(["列名1", "列名2"])["列名3"].mean()
|
计算类别的数量
1 2
| data["列名"].value_counts() data.groupby("列名")["列名"].count()
|
重塑表格
行排序
1 2
| data.sort_values(by="列名") data.sort_values(by=['列名1', '列名2'], ascending=False)
|
由长到宽
1 2 3
| data.sort_index().groupby(["列名"]).head(2) data.pivot(columns="列名1", values="列名2") data.pivot(columns="列名1", values="列名2").plot()
|
透视表
1 2 3
| data.pivot_table(values="列名1", index="列名2", columns="列名3", aggfun="mean") data.pivot_table(values="列名1", index="列名2", columns="列名3", aggfun="mean", margins=True)
|
由宽到长
1 2 3
| data.reset_index() data.melt(id_vars="列名") data.melt(id_vars="列名1", value_vars=["作为变量的列的名字1", "作为变量的列的名字2", ...], value_name="值列的名字", var_name="变量列的名字")
|
合并多表数据
拼接对象
1 2
| data = pd.concat([data1, data2], axis=0) data = pd.concat([data1, data2], keys=["表一索引名", "表二索引名"])
|
使用共同列联接表
1 2
| data = pd.merge(data1, data2, how="left", on="共同列名") data = pd.merge(data1, data2, how="left", left_on="左表用于联接的列", right_on="右表用于联接的列")
|
处理时间序列
使用pandas的datetime属性
1 2 3 4 5 6
| data["时间列列名"] = pd.to_datetime(data["时间列列名"]) data = pd.read_csv("data.csv", parse_dates=["时间列列名"]) data["时间列列名"].max() - data["时间列列名"].min() data["新列名"] = data["时间列列名"].dt.month data.groupby([data["时间列列名"].dt.weekday, "列名1"])["列名2"].mean() data.groupby(data["时间列列名"].dt.hour)["列名"].mean().plot()
|
datetime作为索引
1 2 3 4
| data.index.year data.index.weekday data["year-month-day": "year-month-day"].plot()
|
将时间序列重新采样到另一个频率
1 2 3 4
| data_monthly_max = data.resample("M").max() data_monthly_max.index.freq data.resample("D").mean().plot()
|
操作文本数据
1 2 3 4 5
| data["列名"].str.lower() data["新列名"] = data["列名"].str.split(",").str.get(0) data[data["列名"].str.contrains("字符串")] data["列名"].str.len().idxmax() data["列名"].replace({"值1": "新值1", "值2": "新值2", ...})
|