来自多个数据框的pairplot列,由类别列中的类标记

Posted

技术标签:

【中文标题】来自多个数据框的pairplot列,由类别列中的类标记【英文标题】:pairplot columns from multiple dataframes labelled by classes from the category column 【发布时间】:2021-01-04 08:44:00 【问题描述】:

我不知道该怎么做,但我相信是可行的。我有三个 dataframes 具有相同的列定义,但数据集来自不同年份。然后,我想将数字列一对一地绘制成对,并绘制来自这些dfs 的数据,适当地标记数据来自的集合。目标是了解每一列的数据模式(按年份进行比较)。

我用这两个dataframes 来说明我的意思,其中df1 中的数据集分别来自2018df2 来自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列,由类别列中的类标记的主要内容,如果未能解决你的问题,请参考以下文章

如何突出显示数据框的两个不同列中的唯一数据值?

如何在数据框的其他列中的一列中搜索字符串

在 Spark 数据框的列中为每个组添加递增的数字

将来自一个数据框的值合并到 Pandas 中的新列中[重复]

如果 spark 数据框的特定列中的所有条目都为空,则删除

在R中,获取数据框的子集,其中列中的值包含在列表中[重复]