簡體   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