[英]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 中運行此代碼時,它似乎永遠運行,這讓我認為某處可能存在無限循環(?),但我不確定無限循環可能在哪里。
這是數據框
從您的預期結果中,我看到:
那么你:
你想要這樣的東西:
我還假設結果應該是一個簡單的 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()
不需要內部循環。對於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.