【问题标题】:How to create Multi-column index dataframe & how to plot graphs for each set of values如何创建多列索引数据框以及如何为每组值绘制图表
【发布时间】:2020-03-24 03:26:24
【问题描述】:
  1. 我想创建一个如下的数据框。图片来自我在excel中的内容。 我不想从 excel 导入,而是直接在 pandas 中创建它。 我认为应该可以通过使用pd.MultiIndex.from_product 创建多索引,但我无法弄清楚。

  1. 我想为同一图中的所有 A、B 和 C 创建一个 x 作为 x 轴和 y 作为 y 轴的图表。 我认为这也是可能的,但不确定如何。

你可以忽略图中have中的值。它可以是随机值,不是问题。稍后我会设法弄清楚输入我想要的值。

【问题讨论】:

  • 为什么不使用具有三列 x、y 和类型的数据框?类型列的值可以是“A”、“B”或“C”
  • 数据是这样的,我正在尝试复制它。如果我按照你的建议做,对问题 2 有帮助吗?

标签: python python-3.x pandas multi-index


【解决方案1】:

以下是创建MultiIndex.from_product 的方法。对于绘图,您需要稍微重组数据 - 我在这里使用stackreset_index。我推荐seaborn.Facetgrid 以便于配置散点图。

import matplotlib.pyplot as plt
import seaborn as sns

# Create MultiIndex from_product
columns = pd.MultiIndex.from_product([['A', 'B', 'C'], ['x', 'y']])

np.random.seed(0)
df = pd.DataFrame(np.random.randn(10, 6), columns=columns)
print(df)

          A                   B                   C          
          x         y         x         y         x         y
0  1.764052  0.400157  0.978738  2.240893  1.867558 -0.977278
1  0.950088 -0.151357 -0.103219  0.410599  0.144044  1.454274
2  0.761038  0.121675  0.443863  0.333674  1.494079 -0.205158
3  0.313068 -0.854096 -2.552990  0.653619  0.864436 -0.742165
4  2.269755 -1.454366  0.045759 -0.187184  1.532779  1.469359
5  0.154947  0.378163 -0.887786 -1.980796 -0.347912  0.156349
6  1.230291  1.202380 -0.387327 -0.302303 -1.048553 -1.420018
7 -1.706270  1.950775 -0.509652 -0.438074 -1.252795  0.777490
8 -1.613898 -0.212740 -0.895467  0.386902 -0.510805 -1.180632
9 -0.028182  0.428332  0.066517  0.302472 -0.634322 -0.362741

# Scatter subplots
g = sns.FacetGrid(df.stack(level=0).reset_index(), row='level_1')
g.map(plt.scatter, 'x', 'y')

或者,如果您需要一个区分“A”、“B”和“C”的情节,您可以尝试:

sns.scatterplot(data=df.stack(level=0).reset_index(), x='x', y='y', hue='level_1')

【讨论】:

    【解决方案2】:

    您可能希望创建一个包含三列的数据框:x、y 和 t(“A”、“B”或“C”):

    import pandas as pd
    df = pd.DataFrame({"x": [ 1,   1,   1,   2,   2,   2,   3,   3,   3 ],
                       "y": [ 1,   2,   3,   2,   4,   6,   3,   6,   9 ],
                       "t": ["A", "B", "C", "A", "B", "C", "A", "B", "C"]})
    

    绘制三个不同的线也很容易:

    import matplotlib.pyplot as plt
    
    for index, group in df.groupby("t"):
        plt.plot(group["x"], group["y"])
    plt.show()
    

    【讨论】:

    • 谢谢。另一种方法比我想到的可能需要修改我已经拥有的数据框。尽管如此,我认为我很有帮助。
    猜你喜欢
    • 2021-10-09
    • 2021-04-03
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多