【问题标题】:Plotting data lines from pandas dataframe, identified by keys in one column instead by different columns从 pandas 数据框中绘制数据行,由一列中的键标识,而不是由不同的列
【发布时间】:2012-11-18 19:00:40
【问题描述】:

我正在运行一个模拟,它为我提供了一个在结构上与以下熊猫数据框相对应的 csv 文件:

df = DataFrame({'series': {0: 'A',  1: 'B',  2: 'C',  3: 'A',  4: 'B',  5: 'C',  6: 'A',  7: 'B',  8: 'C',  9: 'A',  10: 'B',  11: 'C',  12: 'A',  13: 'B',  14: 'C'}, 'step': {0: '0',  1: '0',  2: '0',  3: '1',  4: '1',  5: '1',  6: '2',  7: '2',  8: '2',  9: '3',  10: '3',  11: '3',  12: '4',  13: '4',  14: '4'}, 'value': {0: '0',  1: '0',  2: '5',  3: '1',  4: '0',  5: '4',  6: '2',  7: '1',  8: '3',  9: '3',  10: '2',  11: '2',  12: '4',  13: '4',  14: '1'}})

    step  value series
0      0      0      A
1      0      0      B
2      0      5      C
3      1      1      A
4      1      0      B
5      1      4      C
6      2      2      A
7      2      1      B
8      2      3      C
9      3      3      A
10     3      2      B
11     3      2      C
12     4      4      A
13     4      4      B
14     4      1      C

鉴于此 df,我如何绘制每个系列的 (step, value) 对?

也就是说,我要获取图片

这很容易获得(只要df2.plot("step")我可以将我的DataFrame格式转换为df2

   A  B  C  step
0  0  0  5     0
1  1  0  4     1
2  2  1  3     2
3  3  2  2     3
4  4  4  1     4

但我不知道如何进行转换dfdf2 或以任何其他方式从df(这是我从模拟中得到的)获取绘图。

在我的情况下,我可以更改我的模拟代码以将相应的数据写入 16 个单独的表列,而不是一个 series 和一个 value 列,但是 16 是大多数模拟的值,有些不是全部这些系列,将来我可能需要进一步拆分,所以这对我来说不是最好的解决方案。


为了生成两个示例数据帧,我朝另一个方向做了

df2 = pandas.DataFrame({"step":xrange(5),"A":xrange(5),"B":[i*(i+1)/5 for i in xrange(5)],"C":xrange(5,0,-1)})
dfA = df2[["step","A"]].rename(columns={"A":"value"})
dfA["series"] = "A"
dfB = df2[["step","B"]].rename(columns={"B":"value"})
dfB["series"] ="B"
dfC = df2[["step","C"]].rename(columns={"C":"value"})
dfC["series"] ="C"
df = dfA.append(dfB).append(dfC).sort("step")
df.index = xrange(15)

【问题讨论】:

  • 看起来你在管理 csv 文件时遇到了麻烦,而且本身没有绘图,对吗?假设您将 csv 命名为“a1.csv”,d = {}; [d[item[0][0]].append(item[0][1]) if item[0][0] in d else d.update([ (item[0][0], [item[0][1]])]) for item in [ map(lambda x: (x[3], [int(x[1]), int(x[2])]), [line.split()]) for line in open('a1.csv').readlines()[1:]]]; print d 中的 d 是否包含您想要的内容?

标签: python matplotlib pandas


【解决方案1】:

这是获取 DataFrame 的一种方法,您可以在其中更轻松地进行绘图:

In [5]: df2 = DataFrame(dict(
                 (L, df[df['series'] == L]['value'].values)
                       for L in df['series'].unique()))

In [6]: df2
Out[6]: 
   A  B  C
0  0  0  5
1  1  0  4
2  2  1  3
3  3  2  2
4  4  4  1

如果您将索引名称设置为'step',您可以根据需要进行绘图:

In [7]: df2.index.name = 'step'
Out[7]: 
      A  B  C
step         
0     0  0  5
1     1  0  4
2     2  1  3
3     3  2  2
4     4  4  1

In [8]: df2.plot()

这给出了所需的数字。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2023-03-06
    • 2019-04-19
    • 2023-04-05
    • 2020-05-11
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多