gpt4 book ai didi

python - 将 pandas 数据框中的值添加到列表中

转载 作者:行者123 更新时间:2023-12-01 06:48:41 27 4
gpt4 key购买 nike

我有一个数据框,其中的一列包含一年级学生的 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 中运行这段代码时,它似乎会永远运行,这让我认为某个地方可能存在无限循环(?),但我不确定无限循环可能在哪里。

这是数据框

enter image description here

最佳答案

从你的预期结果我看到:

  • 第一个 bin 包含 [0.4 - 0.8] 范围内的元素。
  • 下一个 bin 从 3.0 开始。

所以你:

  • 不希望单侧打开垃圾箱(第一个垃圾箱两侧均关闭)。
  • 既不需要“空箱”,也不需要“相邻范围”(例如[0.4 - 0.8),然后[0.8 - 1.2)等等。

你想要这样的东西:

  • 将上限设置为源列表中的最低元素 + 0.4
  • 放入第一个“bin”元素<= limit(将此列表附加到平均值)。
  • 从列表中删除这些元素。
  • 当列表不为空时重复上述过程。

我还假设结果应该是一个纯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(),不需要内部循环。
  • 当前 bin 的所有值均在一条指令中选择。
  • 删除“已使用”值也是在单个指令中执行的。

对于 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 个列表?不小心,您的示例数据就是这种情况,但请考虑这样的情况情况:

  • 部分值将“非常糟糕”(全部在某个限值附近)。
  • 值(value)观的第二部分将“非常好”(围绕一些限制)。

那么“垃圾箱”的数量将仅为2(而不是 4)。

关于python - 将 pandas 数据框中的值添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com