如何用熊猫创建多个直方图?

时间:2014-08-01 02:33:19

标签: python pandas histogram

我有一个包含三列的csv文件:全名,Test_A_Score,Test_B_Score。 Test_A_Score和Test_B_Score的范围为0-10。我的目标是使用Test_A_Score的每个唯一值从Test_B_Score的值创建直方图。

test_scores.csv

Full name      Test_A_Score Test_B_Score
Jake Johnson        5            8
Helen Smith         9            6
   .
   .
   .
Jonathan Pierce     3            8

到目前为止我的代码:

import pandas as pd

df = pd.read_csv('test_scores.csv', delimiter=',',  na_values=['-']) 

# Get rid of missing scores
df = df[(df['Test_A_Score'] >= 0) & (df['Test_B_Score'] >= 0)]

score_range = range(11)

data = []
for score in score_range:
    scores = df[(df['Test_A_Score'] == score)]['Test_B_Score']
    data.append(scores)

df_hist = pd.DataFrame(data, columns=score_range)

所以,我想我会为score_range获取测试B分数,创建一个新的数据帧,插入数据并用以下内容绘制列的直方图:

import matplotlib.pyplot as plt

plt.figure()
scores_df.hist(color='k', alpha=0.5, bins=20)

问题在于score_range中每个值的分数不具有相同的长度,并且数据需要作为行插入,而不是像列在名为data的列中那样插入。

1 个答案:

答案 0 :(得分:0)

首先,您应该使用.dropna()函数来消除不合理的值。 接下来我认为groupby()函数是你的朋友,如果你寻找'唯一性'。

import pandas as pd
import matplotlib.pyplot as plt

frame = pd.DataFrame([['euler', 1, 3],
['gauss', 1, 5],
['fibo', 1, 6],
['schwartz', 2, 3],
['helmholtz', 2, 4],
['mandelbrodt', 3, 4]], columns=['Name','a','b'])

fig = plt.figure()
ax = [fig.add_subplot(1,3, i) for i in range(1,4)]

for index, (a, group) in enumerate(frame.groupby('a')):
    ax[index].hist(group.b.values)

.groupby()返回一个迭代器,它为您提供组名称和组本身。然后,您可以只绘制每个组的b值的直方图。