来自多个数据框的pairplot列,由类别列中的类标记
Posted
技术标签:
【中文标题】来自多个数据框的pairplot列,由类别列中的类标记【英文标题】:pairplot columns from multiple dataframes labelled by classes from the category column 【发布时间】:2021-01-04 08:44:00 【问题描述】:我不知道该怎么做,但我相信是可行的。我有三个 dataframes
具有相同的列定义,但数据集来自不同年份。然后,我想将数字列一对一地绘制成对,并绘制来自这些df
s 的数据,适当地标记数据来自的集合。目标是了解每一列的数据模式(按年份进行比较)。
我用这两个dataframes
来说明我的意思,其中df1
中的数据集分别来自2018
和df2
来自2019
年:
df1
id speed accelaration jerk mode
0 1 1.94 -1.01 1.05 foot
1 1 0.93 0.04 -0.17 foot
2 3 0.50 -0.16 0.05 bike
3 3 0.57 0.05 0.19 bike
4 5 3.25 -0.13 -0.09 bus
5 5 0.50 -0.25 0.25 bus
6 5 0.25 0.10 0.25 bus
df2
id speed accelaration jerk mode
0 17 1.5 0.00 0.00 foot
1 17 1.5 0.00 -0.30 foot
2 17 1.5 -0.30 0.06 foot
3 15 4.55 0.01 -0.36 bike
4 15 4.57 -0.35 0.02 bike
5 87 9.82 -0.29 -0.12 bus
6 87 8.65 -0.78 0.07 bus
忽略id
列,我想得到一个看起来像这个图的结果(这只是我绘制的预期结果的说明):
为每个df
调用两次sns.pairplot()
不会得到预期的结果,因为我这样做了:
sns.pairplot(df1, vars=df1.columns[1:4], hue='mode')
sns.pairplot(df2, vars=df2.columns[1:4], hue='mode')
plt.show()
有人可以帮助描述如何从中获得预期的答案吗?
【问题讨论】:
【参考方案1】: 给定数据框,为每个数据框添加一个'year'
列
使用pandas.concat
组合数据帧
重置索引,但不要删除它。该索引将用作 x 轴,因为尚未提供。这将保持每个数据帧中数据的相对位置
将'speed'
、'acceleration'
和'jerk'
堆叠成一列'event'
,以创建一个长而整齐的格式数据框。
用seaborn.FacetGrid
绘制数据并用seaborn.scatterplot
映射。
'index'
列,而不是dfl.index
,用作x-axis
。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# add year to the dataframes
df1['year'] = 2018
df2['year'] = 2019
# combine the dataframes
df = pd.concat([df1, df2]).reset_index()
# stack the dataframe into a long (tidy) format
dfl = df.set_index(['index', 'id', 'mode', 'year']).stack().reset_index().rename(columns='level_4': 'event', 0: 'value')
# display(dfl)
index id mode year event value
0 0 1 foot 2018 speed 1.94
1 0 1 foot 2018 accelaration -1.01
2 0 1 foot 2018 jerk 1.05
3 1 1 foot 2018 speed 0.93
4 1 1 foot 2018 accelaration 0.04
5 1 1 foot 2018 jerk -0.17
6 2 3 bike 2018 speed 0.50
7 2 3 bike 2018 accelaration -0.16
8 2 3 bike 2018 jerk 0.05
9 3 3 bike 2018 speed 0.57
# plot a FacetGrid mapped with a scatterplot
g = sns.FacetGrid(data=dfl, row='event', col='mode', hue='year')
g.map(sns.scatterplot, 'index', 'value').add_legend(bbox_to_anchor=(1, 0.5), loc='center left')
g.fig.tight_layout()
【讨论】:
非常感谢您的精彩回答。现在我可以喝点咖啡了。 @arilwan 很高兴这对你有用。凌晨 2 点 36 分在这里。去睡觉了。享受你的咖啡:)以上是关于来自多个数据框的pairplot列,由类别列中的类标记的主要内容,如果未能解决你的问题,请参考以下文章