Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用按列值拆分的2个系列创建线图_Python_Pandas - Fatal编程技术网

Python 使用按列值拆分的2个系列创建线图

Python 使用按列值拆分的2个系列创建线图,python,pandas,Python,Pandas,我正在与之战斗,这应该是一项相当容易的任务。使用2个系列创建线图。到目前为止,我设法做到了,但我认为这不是最快的方法。我想问一下,是否有人知道如何更快/更聪明地完成这项工作 我遇到的问题是,这两个系列的值在同一列“值”中,为了得到系列,我应该根据“类别”列将它们拆分。到目前为止,我通过在绘制之前进行一些转换来实现这一点。这似乎不是最快的解决方案。有没有人知道一种不用我在下面的代码中进行转换就绘制这个图的方法 我的代码: import numpy.random as r import pandas

我正在与之战斗,这应该是一项相当容易的任务。使用2个系列创建线图。到目前为止,我设法做到了,但我认为这不是最快的方法。我想问一下,是否有人知道如何更快/更聪明地完成这项工作

我遇到的问题是,这两个系列的值在同一列“值”中,为了得到系列,我应该根据“类别”列将它们拆分。到目前为止,我通过在绘制之前进行一些转换来实现这一点。这似乎不是最快的解决方案。有没有人知道一种不用我在下面的代码中进行转换就绘制这个图的方法

我的代码:

import numpy.random as r
import pandas as pn

#generate values
values= r.random_sample(200)
labels = range(1,101)+range(1,101)
category = [x for x in 100*'a'+100*'b' ]

#create dataframe
df =pn.DataFrame({'labels': labels,
                 'values': values,
                  'category': category})

### I tired here to create plot but was unsuccessful so far. And needed to make below transformation.

#transformation
df =df.set_index('labels')

dfA= df[df['category']=='a']
del dfA['category']
dfA.columns=['values_a']

dfB=df[df['category']=='b']
del dfB['category']
dfB.columns=['values_b']

#joining
frames=[dfA,dfB]
dff= pn.concat(frames, axis=1)

#ploting
dff.plot()
提前感谢您的帮助

IIUC可与参数
键一起用作列名:

#transformation
df = df.set_index('labels')

dff = pn.concat([df.loc[df['category']=='a', 'values'],
                 df.loc[df['category']=='b', 'values']], 
        axis=1,  
        keys=['values_a', 'values_b'])

print dff
       values_a  values_b
labels                    
1       0.240131  0.083861
2       0.137078  0.788497
3       0.017947  0.985262
4       0.053830  0.882618
5       0.772023  0.753158
6       0.258116  0.322541
7       0.837611  0.188269
8       0.551581  0.599734
...          ...       ...
...          ...       ...
...          ...       ...
93      0.413466  0.794807
94      0.791670  0.186960
95      0.033857  0.070732
96      0.805209  0.570014
97      0.691454  0.125113
98      0.564201  0.104882
99      0.656381  0.176520
100     0.007758  0.340838

[100 rows x 2 columns]
编辑:您可以省略
concat
,然后通过
ax设置图例。图例

import matplotlib.pyplot as plt

plt.figure()
df.loc[df['category']=='a', 'values'].plot()
ax = df.loc[df['category']=='b', 'values'].plot()
ax.legend(['values_a','values_b'])

您可以使用seaborn作为散点图来实现这一点:

import seaborn as sns                  
sns.lmplot('labels', 'values', data=df, hue='category')
如果您喜欢线图:

import seaborn as sns                  
sns.pointplot('labels', 'values', data=df, hue='category')
您必须转换数据,因为您不希望按原样打印列。但有一个更简单的方法:

>>> df.pivot(index='labels', columns='category', values='values').head()
category         a         b
labels                      
1         0.133046  0.762676
2         0.717739  0.774000
3         0.059960  0.547297
4         0.464269  0.951537
5         0.227428  0.987621
>>> df.pivot(index='labels', columns='category', values='values').plot()

Hmmm,也许您可以使用
dff=pn.concat([df.loc[df['category']='a','values'],df.loc[df['category']='b','values']='b',axis=1)
dff.columns=['values\u a','values\u b']
但是有没有办法省略这个转换部分?类似df['values']的东西。绘图(by=df['category'],index=df['labels'])。这样我就不需要做这些变换了。这个解决方案是给出一个带有线性回归趋势的散点图。我想得到一个例子:散点图,点通过线连接。没有回归趋势。