交叉表合并后用python绘图

交叉表合并后用python绘图,python,pandas,dataframe,seaborn,crosstab,Python,Pandas,Dataframe,Seaborn,Crosstab,我想绘制我的数据帧。我先有一个DF: id|project|categories|rating 1 | a | A | 1 1 | a | B | 1 1 | a | C | 2 1 | b | A | 1 1 | b | B | 1 2 | c | A | 1 2 | c | B | 2 现在得到了这个DataFrame: id | pro

我想绘制我的
数据帧
。我先有一个DF:

id|project|categories|rating 1 | a | A | 1 1 | a | B | 1 1 | a | C | 2 1 | b | A | 1 1 | b | B | 1 2 | c | A | 1 2 | c | B | 2 现在得到了这个
DataFrame

id | project | A | B | C | 1 | 2 | 2 | 2 | 1 | 2 | 1 | 1 | 1 | 0 | id |项目| A | B | C| 1 | 2 | 2 | 2 | 1 | 2 | 1 | 1 | 1 | 0 |
现在我想画DF。我想说明,如果项目的数量取决于有多少类别受到影响,或者哪些类别受到影响。我知道如何可视化数据帧,但在交叉表和合并后,它无法正常工作

我使用以下代码复制了您的数据:

import pandas as pd

df = pd.DataFrame({'id': [1, 1, 1, 1, 1, 2, 2,],\
                  'project': ['a', 'a', 'a', 'b', 'b', 'c', 'c'],\
                  'categories': ['A', 'B', 'C', 'A', 'B', 'A', 'B'],\
                  'rating': [1, 1, 2, 1, 1, 1, 2]})
现在数据是这样的

  categories  id project  rating
0          A   1       a       1
1          B   1       a       1
2          C   1       a       2
3          A   1       b       1
4          B   1       b       1
5          A   2       c       1
6          B   2       c       2
如果要将“类别计数”绘制为“项目计数”的函数,则如下所示

import matplotlib.pyplot as plt

# this line is your code
df2 = df.groupby('id').project.nunique().reset_index().merge(pd.crosstab(df.id, df.categories).reset_index())

plt.scatter(df2.project, df2.A, label='A', alpha=0.5)
plt.scatter(df2.project, df2.B, label='B', alpha=0.5)
plt.scatter(df2.project, df2.C, label='C', alpha=0.5)

plt.xlabel('project count')
plt.ylabel('category count')
plt.legend()
plt.show()
你会得到这个


您所说的
它不正常工作是什么意思?你试过什么代码?您是否收到任何错误?我已修复了代码增强,并为
df
creationI添加了导入和存根。我尝试了此操作,但收到错误消息:AttributeError:“DataFrame”对象没有属性“a”。知道为什么吗?我重新命名了这些列,因为我没有A,B,C,。。。但是1,2,3作为列名。DF只是一个例子。更改列名后,我收到此错误消息。但是我不能在列是数字的时候调用它们,比如df2.1,或者我必须调用它吗?你可以通过df2[1](如果int)或df2['1'](如果string)访问列还有一个问题,在可视化中是否有机会忽略类别中的“0”?如果你只想显示y值中的>=1,请添加
plt.ylim(底部=1)
plt.show()之前的

import matplotlib.pyplot as plt

# this line is your code
df2 = df.groupby('id').project.nunique().reset_index().merge(pd.crosstab(df.id, df.categories).reset_index())

plt.scatter(df2.project, df2.A, label='A', alpha=0.5)
plt.scatter(df2.project, df2.B, label='B', alpha=0.5)
plt.scatter(df2.project, df2.C, label='C', alpha=0.5)

plt.xlabel('project count')
plt.ylabel('category count')
plt.legend()
plt.show()