我有一个包含三列的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的列中那样插入。
答案 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值的直方图。