我正在从包含多个页面的 API 检索数据。
初始页面中的必填字段被添加到 pandas 数据帧 - 在我的代码中,该变量最初定义为 df|| |. 从原始的 API 响应中,我能够了解完整响应中的页面总数,因此我可以创建一个循环来迭代页面并按顺序提取所有信息。
里面我将每个页面连接到原始数据帧(
df )的循环,但在这里我收到“ 未来警告 ” 这里是代码:
这是我收到的完整错误:
df = call_to_api(1)
# call_to_api returns the dataframe, the parameter is the page number
current_page = response['Pagination']['PageNumber']
total_pages = response['Pagination']['NumberOfPages']
while current_page < total_pages:
current_page = current_page + 1
df2 = call_to_api(current_page)
df_list = [df, df2]
df = pd.concat([df for df in df_list if not df.empty], ignore_index=True) #Future Error happens here
FutureWarning:DataFrame 与空或的连接的行为 all-NA 条目已被弃用。在未来的版本中,这将不再 确定结果数据类型时排除空列或全 NA 列。到 保留旧的行为,排除之前的相关条目 concat 操作
编写此代码的最佳方法是什么,这样我就不会收到未来错误消息?
What is the best way to write this code so that I dont get the Future Error message?
收到此警告是因为可能在使用
pd.concat
连接数据帧时,其中一些数据帧可能包含完全为空或仅包含 NA 值的列。虽然当前版本 pandas 仍然能够处理这种情况,但未来的版本将改变这种行为,这可能会导致错误或意外的结果。
以下是一些可以解决此问题的方案:
1. 在连接之前过滤掉空数据帧:
可以在将数据帧附加到
df_list
之前检查其是否为空,从而避免连接空数据帧。
df = call_to_api(1)
current_page = response['Pagination']['PageNumber']
total_pages = response['Pagination']['NumberOfPages']
df_list = [df] # 初始化 df_list 包含初始数据帧
while current_page < total_pages:
current_page += 1
df2 = call_to_api(current_page)
if not df2.empty:
df_list.append(df2)
df = pd.concat(df_list, ignore_index=True)
2. 使用
dropna
方法:
可以在连接数据帧之后使用
dropna
方法删除包含 NA 值的列或行。
df = pd.concat([df for df in df_list], ignore_index=True)
df.dropna(axis=1, how='all', inplace=True) # 删除所有值为 NA 的列
3. 指定
pd.concat
的
join
参数:
可以使用
join='inner'
参数来仅连接所有数据帧中都存在的列。
df = pd.concat([df for df in df_list], ignore_index=True, join='inner')
选择哪种方法取决于的具体需求和数据结构。
其他建议:
-
为了提高效率,可以考虑在循环外预先分配
df_list
的大小,因为已经知道需要获取的页面总数。 - 使用列表推导可以使代码更简洁:
df_list = [call_to_api(page) for page in range(1, total_pages + 1)]
df = pd.concat([df for df in df_list if not df.empty], ignore_index=True)
希望这些解释和解决方案对有所帮助! 如果还有其他问题,请随时提出。
标签:python,pandas,dataframe,future-warning From: 78800740