【问题标题】:How to get Pandas to stop automatically sorting column titles in new DF如何让 Pandas 停止自动对新 DF 中的列标题进行排序
【发布时间】:2020-01-12 14:59:02
【问题描述】:

我正在尝试基于重复的 API 调用构建 Pandas DataFrame。我已将 JSON 响应对象(其中包含比我需要的更多的数据)过滤到几个字典中。当我合并字典(使用python new_dict = {**old_dict1, **old_dict2})时,键的顺序被保留。但是,当我创建一个空白数据框并使用 append 参数时,即使 sort 参数为 false,生成的数据框也会按字母顺序对列名(以前的 dict 键)进行排序。我想保留原来的顺序

这是我希望创建的数据框的示例行:

detection_dict={'blacklist_detections': 0,'detection_rate':'0%'}
geo_dict={'continent': 'North America','country':'United States','region':'Alabama'}
anon_dict = {'is_proxy': False,'is_webproxy': False,'is_vpn': False,'is_hosting': False,'is_tor': False}

combo_dict = {**detection_dict, **geo_dict, **anon_dict}

调用 combo_dict 返回:

{'blacklist_detections': 0,
 'detection_rate': '0%',
 'continent': 'North America',
 'country': 'United States',
 'region': 'Alabama',
 'is_proxy': False,
 'is_webproxy': False,
 'is_vpn': False,
 'is_hosting': False,
 'is_tor': False}

我希望这些键保留的顺序是什么。但是,调用

df = pd.DataFrame()
df.append(combo_dict, ignore_index = True, sort = False)

返回一个数据框,其中所有键按字母顺序排序(blacklist_detections、continents、country、detection_rate 等)

我不确定是我将每一行添加到数据框的方式还是我合并字典的方式是造成这种行为的原因,但我希望它保持未排序。我不明白为什么 sort=False 没有为我做任何事情。任何帮助将不胜感激!

【问题讨论】:

    标签: python python-3.x pandas dataframe jupyter-notebook


    【解决方案1】:

    它以您的方式对列进行排序的原因是您从一个空的 DataFrame 开始。基于df.append() code,pandas 使用pandas.index.difference 检查现有 df 中的列与附加行之间的差异,默认情况下将对列进行排序,因为这些列都不存在于空 df 中。

    如果出于某种原因您需要从一个空的DataFrame开始,而不是上面答案中的其他替代方案,那么您可以随时这样做:

    combo_cols = list(combo_dict) # get the current order of the columns
    df = pd.DataFrame(columns=combo_cols) # set empty df columns to match 
    df.append(combo_dict, ignore_index = True, sort = False) # append the dataframes
    

    【讨论】:

    • 谢谢!这正是我所需要的。我认为这与从空白 df 或 .append() 开始有关,但我无法完全连接这些点。
    【解决方案2】:

    你可以试试 df=pd.DataFrame(combo_dict,index=[0])。 它应该返回一个类似于 combo_dict 字典的未排序数据帧。

    【讨论】:

      【解决方案3】:

      我设置了您提供的字典,然后使用pd.Dataframe.from_dict() 生成数据帧。检查这是否会产生您想要的结果。

      import pandas as pd
      
      api_data = {'detection_dict' : {'blacklist_detections': 0,'detection_rate':'0%'},
                  'geo_dict' : {'continent': 'North America','country':'United States','region':'Alabama'},
                  'anon_dict' : {'is_proxy': False,'is_webproxy': False,'is_vpn': False,'is_hosting': False,'is_tor': False}}
      
      df = pd.DataFrame.from_dict(api_data)
      df
      
      ------
                           detection_dict geo_dict        anon_dict
      blacklist_detections 0              NaN             NaN
      continent            NaN            North America   NaN
      country              NaN            United States   NaN
      detection_rate       0              NaN             NaN
      ...
      ...
      

      【讨论】:

        猜你喜欢
        • 2019-06-09
        • 2017-05-28
        • 2020-09-12
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 2022-11-29
        相关资源
        最近更新 更多