如何合并具有相同索引的两行中的值

时间:2021-04-10 01:26:43

标签: python pandas dataframe matplotlib

我有一个数据框,每两行有相等的“时间”索引,两个“数据”列的值可能相等,值 1 只包含正数,值 2 只包含负值,一个“类型”列与一行不同来自另一个:

time     type  value1 value2
01:26:00  A     1      -5
01:26:00  B     2      -6
01:28:35  A     3      -7
01:28:35  B     4      -8

我可以为任一类型绘制条形图,也可以绘制一个叠加在一起的组合条形图(当我注释掉第 1 行时):

df = df.loc['type'] /line #1
df.plot(x='time', y=['value1', 'value2'], kind='bar', stacked=True)

我需要的是绘制条形图,时间在 X 轴上,A 的值 1 与 B 的值 1 并排,相反的是 A 的值 2 和 B 的值 2,如下所示:

enter image description here

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这可以使用 seaborn barplot 函数来完成,该函数提供了方便的 hue 参数,可以并排显示 A 和 B。在以下示例中,saturation 参数用于区分 value1 和 value2:

import io
import pandas as pd    # v 1.2.3
import seaborn as sns  # v 0.11.1

# Create sample dataset
data = """
time     type  value1 value2
01:26:00  A     1      -5
01:26:00  B     2      -6
01:28:35  A     3      -7
01:28:35  B     4      -8
"""
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)

# Create bar chart
ax = sns.barplot(data=df, x='time', y='value1', hue='type', saturation=1, zorder=2)
sns.barplot(data=df, x='time', y='value2', hue='type', saturation=0.6, zorder=2, ax=ax)
ax.set_ylabel('value1 and value2', labelpad=10)

# Format chart
ax.grid(axis='y', linewidth=0.5, zorder=1)
ax.axhline(color='black', linewidth=1, alpha=0.3)
ax.tick_params(axis='both', which='major', length=0)
sns.despine(left=True, bottom=True)

# Edit legend
handles, labels = ax.get_legend_handles_labels()
ntypes = df['type'].nunique()
ax.legend(handles[:ntypes], labels[:ntypes], loc=(1.03, 0.5), frameon=False);

barplot

相关问题