python - 将 pandas 数据框中的值添加到列表中
问题描述
我有一个数据框,其中该数据框中的一列具有一年级学生的 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 中运行此代码时,它似乎永远运行,这让我认为某处可能存在无限循环(?)但我不确定无限循环可能在哪里。
这是数据框
解决方案
从您的预期结果中,我看到:
- 第一个 bin 包含[0.4 - 0.8]范围内的元素。
- 下一个 bin 从3.0开始。
那么你:
- 不希望单边打开垃圾箱(第一个垃圾箱两边都关闭)。
- 既不想要“ëmpty bins”也不想要“相邻范围”(例如[0.4 - 0.8),然后是[0.8 - 1.2) 等等。
你想要这样的东西:
- 将 üpper 限制设置为源列表中的最低元素 + 0.4。
- 放入第一个“bin”元素 <= limit(将此列表附加到averages)。
- 从列表中删除这些元素。
- 当列表不为空时重复上述过程。
我还假设结果应该是一个普通的 Python list of lists。
要获得此结果,请尝试以下代码:
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 个列表?意外地,您的样本数据就是这种情况,但请考虑以下情况:
- 价值的一部分将是“非常糟糕”(都在某个下限附近)。
- 值的第二部分将是“非常好”(都在某个上限附近 )。
那么“垃圾箱”的数量将只有2 个(而不是 4 个)。
推荐阅读
- php - PHP:在另一个内部添加回显内容
- mysql - MySql 错误 1415 不允许从函数返回结果集
- android-studio - Aapt2Exception:Android资源编译失败错误:资源'attr/actionBarSize'与配置''的重复值
- javascript - form_for 表单的字符计数器未实时更新计数
- python-3.x - AWS vs localhost 上的可变 time.sleep(X.XX) FPS 结果
- algorithm - 在熟人列表中找到名字的复杂性是什么
- php - 在 public_html 之外存储图像
- node.js - 是否可以使用 google-spreadsheet-to-json 并部署为 firebase 功能?
- php - php mysql准备好的语句LIKE在Wordpress中不起作用
- python - 如何合并元组列表