merge、join以及concat的方法的不同以及相同
相同之处:都用于合并数据。 不同之处:
merge
主要是基于列的合并。join
主要是基于索引(行标签)的合并。concat
可以沿任意轴合并,更灵活。
import pandas as pddf1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
merge
result = pd.merge(df1, df2, on='A', how='outer')
join
df1 = df1.set_index('A')
df2 = df2.set_index('A')
result = df1.join(df2, lsuffix='_df1', rsuffix='_df2')
df1 = df1.set_index('A')
:将df1
的索引设置为"A"列,意味着后续的连接操作将基于这个列的值。df2 = df2.set_index('A')
:同样地,将df2
的索引设置为"A"列。result = df1.join(df2, lsuffix='_df1', rsuffix='_df2')
:使用join
方法将df1
和df2
连接在一起。参数lsuffix
和rsuffix
是必要的,因为两个DataFrame在设置索引后将具有相同的列名,这些后缀将添加到重叠列名中,以便区分来自哪个DataFrame。- 如果df2中A列中的值有与df1中A的值相同的则会连接在一起,否则将会补成nan
concat
result = pd.concat([df1, df2])
stack函数
stack
的作用是重新塑造DataFrame,它将数据的列“堆叠”成行,生成一个MultiIndex Series,其中新的索引级别包括原始DataFrame的列名。这有助于将宽格式的数据转换为长格式,并常用于准备数据进行分析或可视化。
例如,如果原始DataFrame是:
A B
0 1 2
1 3 4
那么stack()
的结果将是:
0 A 1B 2
1 A 3B 4
dtype: int64
agg函数
agg
函数是Pandas库中的一个强大工具,用于聚合操作。它允许你同时对一个或多个列执行多种聚合操作。
使用agg
函数,你可以一次执行例如求和、平均值、最小值和最大值等多种操作,并将结果组合成一个DataFrame。
以下是一个示例,说明如何使用agg
函数:
import pandas as pd# 创建一个示例DataFrame
df = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6]
})# 对'A'列求和,对'B'列求最大值和最小值
result = df.agg({'A': 'sum','B': ['max', 'min']
})
结果是:
A B
max NaN 6.0
min NaN 4.0
sum 6.0 NaN
也可以对整个DataFrame调用agg
并应用相同的聚合函数到每一列:
result = df.agg(['sum', 'mean'])
A B
sum 6 15
mean 2.0 5.0
countplot--计算条形统计图
sns.countplot(x="Pclass", hue="Survived", data=text)
-
x="Pclass"
:设置x轴上的变量为"Pclass"列。这意味着图形将显示该列中不同类别的计数。 -
hue="Survived"
:使用"Survived"列为图形着色,这样你就可以看到每个"Pclass"类别中"Survived"的不同值的计数。这可以帮助你理解"Pclass"和"Survived"之间的关系。 -
data=text
:设置数据源为text
DataFrame。这是你之前从CSV文件读取的数据。
FacetGrid
facet = sns.FacetGrid(text, hue="Survived",aspect=3)
FacetGrid
是一个用于创建一组图形的对象,这些图形可以根据一个或多个分类变量的不同级别展示数据。
-
facet = sns.FacetGrid()
:创建一个FacetGrid
对象并将其赋值给变量facet
。 -
text
:第一个参数,指定要使用的DataFrame,这里是text
。 -
hue="Survived"
:设置着色变量为"Survived"列。这意味着在网格内的每个小图中,不同的"Survived"值将使用不同的颜色表示。 -
aspect=3
:设置每个小图的宽高比为3。这控制了每个小图的形状。
kdeplot--核密度估计图
facet.map(sns.kdeplot,'Age',shade= True)
-
facet
: 这是一个已经创建的FacetGrid
对象,通常基于某个分类变量对数据进行分组。 -
.map()
: 这是FacetGrid
对象的方法,用于在网格的每个子集上绘制特定类型的图。 -
sns.kdeplot
: 这是传递给map
方法的绘图函数,用于在每个facet上绘制核密度估计图。 -
'Age'
: 这是传递给kdeplot
的变量名,表示要绘制KDE图的DataFrame中的列名。 -
shade=True
: 这是传递给kdeplot
的一个参数,表示KDE图下方的区域将被填充或"阴影",使图形更容易阅读和解释。
facet.set
facet.set(xlim=(0, text['Age'].max()))
这行代码设置了FacetGrid
对象中每个子图的x轴范围。
-
facet
: 这是一个已经创建的FacetGrid
对象。 -
.set()
: 这是FacetGrid
对象的一个方法,用于设置网格属性。 -
xlim=(0, text['Age'].max())
: 这是传递给set
方法的一个参数,用于设置x轴的限制。0
: x轴的起始值设置为0。text['Age'].max()
: x轴的结束值设置为text
DataFrame中'Age'
列的最大值。
facet.add_legend()
facet.add_legend()
facet.add_legend()
是Seaborn库中FacetGrid
对象的一个方法,用于在图的一个角落添加图例。
图例是一个包含一个或多个条目的区域,每个条目由一个标记(例如颜色块或线条)和一个标签组成。图例用于解释图中的符号和颜色代表的含义。
如果之前创建的FacetGrid
对象facet
基于某个分类变量进行着色(例如通过hue
参数指定),那么调用facet.add_legend()
将添加一个图例来解释这些颜色。
图例通常自动基于hue
参数所代表的数据列的名称和唯一值生成。
折线图表示年龄分布情况
text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
为什么所有的曲线都被添加到同一个图上:
-
没有新的图形或轴创建:如果你想在不同的图或轴上绘制,你通常会使用像
plt.figure()
或plt.subplot()
这样的函数来创建新的图或轴。在你的代码中,没有使用这些函数,所以所有的绘图都被添加到当前的图和轴上。 -
连续的绘图调用:当你连续调用
plot
函数,matplotlib会在当前活动的轴上绘制。如果没有创建新的轴或图,那么连续的绘图调用将在同一个轴上绘制。 -
全局状态:matplotlib有一个全局状态机制,它跟踪当前的图、轴等。当你调用像
plt.plot()
这样的函数时,它操作当前活动的图和轴。如果你不显式地改变活动的图或轴,连续的调用将在同一位置操作。
填充问题
具体地说,plot
方法的kind='kde'
选项并不直接接受shade
参数。如果你想要控制阴影或填充KDE图下方的区域,你可以直接使用Seaborn的kdeplot
函数,或者使用matplotlib的命令来手动填充。
import seaborn as sns
sns.kdeplot(text.Age[text.Pclass == 1], shade=True)
sns.kdeplot(text.Age[text.Pclass == 2], shade=True)
sns.kdeplot(text.Age[text.Pclass == 3], shade=True)
plt.xlabel("age")
plt.legend((1,2,3),loc="best")