为分组的 pandas 数据框创建散点图

Creating a scatterplot for a grouped pandas dataframe

我有一个 Pandas DataFrame,我想在其中按特定列进行分组。之后,我想制作这个分组数据框的散点图。但是,如果我这样做,我会收到错误消息,因为我分组的列无法识别。

# Data loading, processing and for more
import pandas as pd
import numpy as np

# Visualization
import seaborn as sns
import matplotlib.pyplot as plt
# set seaborn style because it prettier
sns.set()

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

df2 = df.groupby(['A']).agg({'D':sum})
df2.plot.scatter(x='A', y='D')

如何创建这样的散点图?

您需要在 groupby 之后重置索引。

import pandas as pd
import numpy as np

# Visualization
import seaborn as sns
import matplotlib.pyplot as plt
# set seaborn style because it prettier
sns.set()

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

df2 = df.groupby(['A']).agg({'D':sum})
df2.reset_index(inplace=True)
df2.plot.scatter(x='A', y='D')

进行groupby操作时,默认将groupby操作的列作为索引。在上面的例子中,在 groupby 之后,如果你检查 df2,它的结构将是这样的:

In [2]: df2                                                                                                                                                                     
Out[2]: 
      D
A      
0   180
1    29
2    52
3    39
4    91
..  ...
93   56
94   17
96   47
98  125
99  214

[61 rows x 1 columns]

要访问列 A,您需要使用 reset_index 将索引作为单独的列。

您可以不将 A 设置为 groupby 中的索引:

# notice the difference `sum` and `'sum'`
# the later is vectorized
df2 = df.groupby(['A'], as_index=False).agg({'D':'sum'})

df2.plot.scatter(x='A', y='D')

或者您可以保留您的代码并使用 plt.scatter:

df2 = df.groupby(['A']).agg({'D':'sum'})
plt.scatter(df2.index, df2['D'])