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

时间:2019-11-30 17:32:04

标签: 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中运行此代码时,它似乎可以永远运行,这使我认为某个地方可能存在无限循环(?),但我不确定该无限循环可能在哪里。

这是数据框

enter image description here

2 个答案:

答案 0 :(得分:1)

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

  • 第一个垃圾箱包含的元素范围为 [0.4-0.8]
  • 下一个垃圾箱从 3.0 开始。

所以你:

  • 不要单侧打开垃圾箱(第一个垃圾箱在两侧侧都关闭)。
  • 既不希望“垃圾箱”也不希望其邻近范围(例如 [0.4-0.8),然后是 [0.8-1.2] 等等。

您想要这样的东西:

  • 将üpper限制设置为源列表+ 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个列表? 偶然的是您的样本数据就是这种情况,但请考虑这样 情况:

  • 其中一部分值是“非常糟糕”(大约在下限值)。
  • 值的第二部分将是“非常好”(围绕某些上部 限制)。

然后,“垃圾箱”的数量将仅为 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]]