繁体   English   中英

将熊猫数据框中的值添加到列表中

[英]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 中运行此代码时,它似乎永远运行,这让我认为某处可能存在无限循环(?),但我不确定无限循环可能在哪里。

这是数据框

在此处输入图片说明

从您的预期结果中,我看到:

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

那么你:

  • 不想一个侧开式箱(第一箱在两侧封闭)。
  • 既不想要“ëmpty bins”也不想要“相邻范围”(例如[0.4 - 0.8) ,然后是[0.8 - 1.2)等等。

你想要这样的东西:

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

我还假设结果应该是一个简单的 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 个列表? 偶然地,您的示例数据就是这种情况,但请考虑以下情况:

  • 值的一部分将是“非常糟糕”(所有周围的一些下限)。
  • 值的第二部分将是“非常好”(各地一些上限)。

那么“垃圾箱”的数量将仅为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM