Python 按绘图值分组
我有一个熊猫数据框,看起来像这样:Python 按绘图值分组,python,pandas,matplotlib,pandas-groupby,Python,Pandas,Matplotlib,Pandas Groupby,我有一个熊猫数据框,看起来像这样: **real I SI weights** 0 1 3 0.3 0 2 4 0.2 0 1 3 0.5 0 1 5 0.5 1 2 5 0.3 1 2 4
**real I SI weights**
0 1 3 0.3
0 2 4 0.2
0 1 3 0.5
0 1 5 0.5
1 2 5 0.3
1 2 4 0.2
1 1 3 0.5
我需要将其除以“real”,然后我需要执行以下操作:
给定i的值,考虑SI的每个值并增加总重量。最后,对于每一次实现,我应该有这样的东西:
real = 0:
I = 1 SI = 3 weight = 0.8
SI = 5 weight = 0.5
I = 2 SI = 4 weight = 0.2
real = 1:
I = 1 SI = 3 weight = 0.5
I = 2 SI = 5 weight = 0.3
SI = 4 weight = 0.2
然后,在x轴上绘制I和real的每个值的SI值,在y轴上绘制相对总权重(归一化为1)
我想做的是:
name = ['I', 'SI','weight', 'real']
Location = 'Simulationsdata/prova.csv'
df = pd.read_csv(Location, names = name,sep='\t',encoding='latin1')
results = df.groupby(['I', 'real', 'SI']).weight.sum()
当我打印结果时,我得到了我想要的表格,但现在我不知道如何按照我想要的方式进行绘图,因为我不知道如何获得SI值…一旦您这样做:
results = df.groupby(['real', 'I', 'SI'])['weights'].sum()
您可以通过使用获取存储在数据帧中的'real'
、'I'
和'SI'
的值
results.index.get_level_values(0)
Int64Index([0, 0, 0, 1, 1, 1], dtype='int64', name='real'
results.index.get_level_values(1)
Int64Index([1, 1, 2, 1, 2, 2], dtype='int64', name=' I')
results.index.get_level_values(2)
Int64Index([3, 5, 4, 3, 4, 5], dtype='int64', name=' SI')
你可以迭代这些来得到你想要的图。例如:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2)
for idx1, i in enumerate(results.index.get_level_values(0).unique()):
for idx2, j in enumerate(results.index.get_level_values(1).unique()):
axes[idx1, idx2].plot(results.loc[i, j], 'o')
axes[idx1, idx2].set_xlabel('SI')
axes[idx1, idx2].set_ylabel('weights')
axes[idx1, idx2].set_xlim([0, 6])
axes[idx1, idx2].set_ylim([0, 1])
axes[idx1, idx2].set_title('real: {} I: {}'.format(i, j))
plt.tight_layout()
plt.show()
给
当我尝试打印df.index.get_level_值时(1)我获得:indexer错误:级别太多:index只有1个级别,而不是2您确定您的
df
是在groupby().sum()之后的,而不是刚刚加载csv之后的?我更改了变量名以使其更清晰。你还可以打印df
和df.index
并将内容添加到你的问题中吗?是的,我已经解决了这个问题,但我仍然无法确定如何实际进行迭代,以获得每个I的SI向量及其权重,这样我就可以开始绘制它们了!那就行了,谢谢你。我坚持这个解决方案,但我仍然怀疑这是否是最“pythonic”的方法!无论如何,我接受你的答案,因为它解决了我的问题是的,这是快速和肮脏的,一个人可能会想出一些更python的,问题是:它值得努力吗?:-)在您的名称中
有一个额外的列没有出现在示例tsv中,您需要修复它(我的打字错误,delta与weight相同,t是一个额外但无用的列)