[英]Add values from pandas dataframe to a list
我有一个数据框,其中该数据框中的一列包含一年级学生的 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 中运行此代码时,它似乎永远运行,这让我认为某处可能存在无限循环(?),但我不确定无限循环可能在哪里。
这是数据框
从您的预期结果中,我看到:
那么你:
你想要这样的东西:
我还假设结果应该是一个简单的 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)。
这是我的方式:假设 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]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.