使用 WHILE 循环组合多个数据帧

Combine multiple Data Frames with WHILE loop

Screenshot of results from Updated code from suggestion

'dlist' 是数据框中的提供商 ID 列表。我尝试对 'dlist' 使用 while 循环,但它仅 returns 数组中最后一个提供者 ID 的值。在本例中为 1005。我使用了追加函数,但它什么也没做。提供者 ID 1000 中的额外 74 行未显示。我如何组合所有内容,以便它显示 dlist 中两个数字的值,等于 684 行?

dlist = ["1000", "1005"]

final_list = pd.DataFrame()

index = 0

while index < len(dlist):
    provider = dlist[index]
    
    # Filter dentist (CHANGEABLE)
    final_list = report_df[(report_df["provider_id"] == provider)]

    # Sort values of the codes
    final_list = final_list.sort_values(['codes','report_month'], ascending=True)

    # Drop 'report_year' column
    final_list = final_list.drop(['report_year'], axis = 1)

    # Change 'report_month' numbers into month name
    final_list = final_list.replace({'report_month': {1: "January",
                                                      2: "February",
                                                      3: "March",
                                                      4: "April",
                                                      5: "May",
                                                      6: "June",
                                                      7: "July",
                                                      8: "August",
                                                      9: "September",
                                                      10: "October",
                                                      11: "November"}})
    final_list.append(final_list)
    index +=1

Missing values

Result of the current code

您可以创建一个包含所有数据框的列表,然后将它们连接起来。 就像 while 循环之前有一个数据帧列表。

list_of_dfs = []

并在 index+=1 之前将 final_list 添加到数据帧列表中。

list_of_dfs.append(final_list)

您可能不想像 final_list.append(final_list) 那样追加。

最终,你可以做到

my_df_of_concern = pd.concat(list_of_dfs, index=0)

https://pandas.pydata.org/docs/reference/api/pandas.concat.html

你的问题是你一次又一次地修改同一个变量。在您的代码中:

Line 1: while index < len(dlist):
Line 2:    provider = dlist[index]
    
Line 3:    # Filter dentist (CHANGEABLE)
Line 4:    final_list = report_df[(report_df["provider_id"] == provider)] # PROBLEM LINE
Line 5:    # MORE CODE
Line 6:    # MORE CODE
Line 7:    final_list.append(final_list)
Line 8:    index +=1

因为您的 dlist["1000", "1005"],在第一个 运行 期间,在第 4 行,final_listprovider_id == 1000 所在的所有行。然后对其进行一些修改,然后在第 7 行中将其附加到同一个对象。所以现在,final_list 将拥有所有内容的 2 个副本,因为你正在做 final_list.append(final_list)

然后你增加索引并在下一次迭代中提供者现在是 1005,你再次执行第 4 行,你的 final_list 将被覆盖。这意味着存储在该变量中的所有先前值不再存在,仅存在 provider_id == 1005 的新值。

尝试像这样更改您的代码

while index < len(dlist):
    provider = dlist[index]
    
    # Filter dentist (CHANGEABLE)
    report_list = report_df[(report_df["provider_id"] == provider)]

    # Sort values of the codes
    report_list = report_list.sort_values(['codes','report_month'], ascending=True)

    # Drop 'report_year' column
    report_list = report_list.drop(['report_year'], axis = 1)

    # Change 'report_month' numbers into month name
    report_list = report_list.replace({'report_month': {1: "January",
                                                      2: "February",
                                                      3: "March",
                                                      4: "April",
                                                      5: "May",
                                                      6: "June",
                                                      7: "July",
                                                      8: "August",
                                                      9: "September",
                                                      10: "October",
                                                      11: "November"}})
    final_list.append(report_list)
    index +=1

report_list 充当一个临时变量,它保存特定提供者的所有数据,然后在您进行所有修改(例如删除 report_year 列、排序等)之后,您将值附加到 final_list。现在您将拥有跨越多个迭代的数据。

此外,而不是做

while index < len(dlist):
    provider = dlist[index]
    index +=1

你可以这样做:

for provider in dlist:
    # YOUR CODE where provider will be "1000" for 1st run and "1005" in second run