如何绘制数据框的每一行

How to bar plot each row of a dataframe

数据框如下所示:

import pandas as pd
import numpy as np  # used for the nan values

data = {'card_name': ['Diamonds', 'Clovers', 'HorseShoe'], '': [1000.0, 10.0, np.nan], '': [500.0, np.nan, 1873.0], '': [25, 213, 4657], '': [np.nan, 2199.0, np.nan], '': [1500.0, np.nan, 344.0], '': [np.nan, 43.0, 239.0], '': [30.0, 2.0, np.nan], '0': [1.0, np.nan, 748.0]}
df = pd.DataFrame(data)

   card_name                   0
0  Diamonds   1000  500  25   NaN 1500   NaN    30    1
1  Clovers    10    NaN  213 2199  NaN   43     2    NaN
2  HorseShoe  NaN  1873 4657  NaN  344   239   NaN   748

美元符号栏名称下的数字是相应card_name上的奖品数量。

我正在尝试绘制每个 card_name 的图表并显示所有列的奖品数量。

我正在使用 Python 和 Pandas 以及 Matplotlib/Seaborn

  • 所需数据框的形状取决于使用哪个绘图 API 进行绘图。
    • pandasseaborn 都依赖于 matplotlib,但需要不同的形状才能获得相同的结果。

pandas

  • 设置'card_name'为索引,然后用.T转置dataframe。
  • 直接使用 pandas.DataFrame.plotkind='bar' 绘制数据帧。索引绘制为轴。
# set the index and transpose
dft = df.set_index('card_name').T

# display(dft)
card_name  Diamonds  Clovers  HorseShoe
          1000.0     10.0        NaN
           500.0      NaN     1873.0
            25.0    213.0     4657.0
             NaN   2199.0        NaN
          1500.0      NaN      344.0
             NaN     43.0      239.0
            30.0      2.0        NaN
0            1.0      NaN      748.0

# plot
dft.plot(kind='bar', rot=0)

seaborn

# convert the dataframe to long format
dfm = df.melt(id_vars='card_name')

# display(dfm.head())
   card_name variable   value
0   Diamonds        1000.0
1    Clovers          10.0
2  HorseShoe           NaN
3   Diamonds         500.0
4    Clovers           NaN

ax = sns.barplot(data=dfm, x='variable', y='value', hue='card_name')

subplots

pandas

  • 添加参数subplots=True
# using the previously transformed dataframe dft
axes = dft.plot(kind='bar', rot=0, subplots=True, figsize=(6, 10))

seaborn

  • 通过指定 row= and/or col= 参数,使用 .catplot 获取子图更容易。
# using the previously transformed dataframe dfm
p = sns.catplot(kind='bar', data=dfm, x='variable', y='value', row='card_name', height=3, aspect=1.5)