我有一个数据框,其中该数据框的一列包含一年级学生的GPA。我想遍历此列,并将所有落入彼此0.4个单位内的所有值追加到列表的列表中。例如,如果我具有值(0.4,0.6,0.8,3,3.4),那么我希望我的列表为[[0.4,0.6,0.8],[3,3.4]]。
这是我尝试过的代码。
averages = [[] for w in range(len(df['GPA_year1'])//4)]
small = min(df['GPA_year1']) + 0.4
for i in range(len(averages)):
for y in range(len(df['GPA_year1'])):
if small - 0.4 <= df['GPA_year1'][y] <= (small + 0.4):
averages[i].append(df['GPA_year1'][y])
small = small + 0.4
但是,当我在Jupyter Notebook中运行此代码时,它似乎可以永远运行,这使我认为某个地方可能存在无限循环(?),但我不确定该无限循环可能在哪里。
这是数据框
答案 0 :(得分:1)
从您的预期结果中,我看到了:
所以你:
您想要这样的东西:
我还假定结果应为普通Python 列表列表。
要获得此结果,请尝试以下代码:
averages = []
src = df['GPA_year1'].sort_values()
while not src.empty:
limit = src.min() + 0.4
currBin = src[src <= limit]
averages.append(currBin.to_list())
src.drop(currBin.index, inplace=True)
此代码应运行得更快,因为:
sort_values()
,因此不需要内循环。对于DataFrame中的 GPA_year1 列,此代码生成:
[[0.74], [1.95, 2.18, 2.34], [3.23, 3.23, 3.44, 3.49], [3.64, 3.78, 3.82]]
关于您的代码的另一句话:
averages = [[] for w in range(len(df['GPA_year1'])//4)]
看起来很奇怪。 您怎么知道输出列表将仅包含4个列表? 偶然的是您的样本数据就是这种情况,但请考虑这样 情况:
然后,“垃圾箱”的数量将仅为 2 (而不是4)。
答案 1 :(得分:0)
这是我的方法:假设df是您的数据框:
GPA_year1 = df['GPA_year1'].tolist()
GPA_year1 = [3.82, 3.64, 1.95, 3.44, 2.18, 3.49, 3.78, 3.23, 0.74, 3.23, 0.74, 3.23, 2.34]
排序列表:
GPA_year1.sort()
使用第一个元素初始化平均值列表
averages = [[GPA_year1[0]]]
遍历您的列表:
for x, y in zip(GPA_year1, GPA_year1[1:]):
if y - x <= 0.4:
averages[-1].append(y)
else:
averages.append([y]) #if not create a new sublist
print(averages)
# [[0.74, 0.74], [1.95, 2.18, 2.34], [3.23, 3.23, 3.23, 3.44, 3.49, 3.64, 3.78, 3.82]]