【问题标题】:How to flatten data numpy.ndarray in python如何在python中展平数据numpy.ndarray
【发布时间】:2020-12-13 15:27:24
【问题描述】:

我有一个如下所示的 numpy.ndarray 数据,我想将其展平以便可以对其进行操作。请在下面找到我的示例数据:

sample_data=[list([{'region': 'urn:li:region:9194', 'followerCounts': {'organicFollowerCount': 157, 'paidFollowerCount': 0}}, {'region': 'urn:li:region:7127', 'followerCounts': {'organicFollowerCount': 17, 'paidFollowerCount': 0}}])]

我尝试使用以下代码,但还没有成功:

sample.flatter()

想要的输出如下:

region                 organicFollowerCount   paidFollowerCount

urn:li:region:9194    157                          0
urn:li:region:7127    17                           0

谁能帮我实现这个目标?

【问题讨论】:

    标签: python list dataframe dictionary flatten


    【解决方案1】:

    这是一种使用pd.json_normalize的方法:

    import pandas as pd
    
    # note that `sample data` has been modified into a list of dictionaries
    sample_data = [
        {'region': 'urn:li:region:9194', 
         'followerCounts': {'organicFollowerCount': 157, 'paidFollowerCount': 0}}, 
        {'region': 'urn:li:region:7127', 
         'followerCounts': {'organicFollowerCount': 17, 'paidFollowerCount': 0}}
    ]
    

    现在,将列表中的每个项目转换为数据框:

    dfs = list()
    
    # convert one dict at a time into a data frame, using json_normalize()
    for sd in sample_data:
        t = pd.json_normalize(sd)
        dfs.append(t)
    
    # convert list of dataframes into a single data frame, 
    #   and change column labels
    t = pd.concat(dfs).rename(columns={
        'followerCounts.organicFollowerCount': 'organicFollowerCount',
        'followerCounts.paidFollowerCount': 'paidFollowerCount'
    }).set_index('region')
    
    print(t)
    
    
                        organicFollowerCount  paidFollowerCount
    region                                                     
    urn:li:region:9194                   157                  0
    urn:li:region:7127                    17                  0
    

    正如@thehumaneraser 所说,这种格式并不理想,但我们不能总是影响我们收到的数据的格式。

    【讨论】:

      【解决方案2】:

      您将无法使用 Numpy 的 flatten 方法以您想要的方式展平这些数据。该方法只需采用多维 ndarray 并将其展平为一维。你可以阅读文档here

      其他几件事。首先,您上面的示例数据不是 ndarray,它只是一个 python 列表。实际上,由于您在方括号内调用list(),它是一个嵌套的字典列表。这确实不是存储此信息的好方法,并且基于这种复杂的格式,您几乎没有选择将其很好地“展平”到您想要的表格中。

      如果您有很多这样的行,我会执行以下操作:

      headers = ["region", "organicFollowerCount", "paidFollowerCount"]
      data = [headers]
      for row in sample_data[0]: # Subindexing here because it is unwisely a nested list
          formatted_row = []
          formatted_row.append(row["region"])
          formatted_row.append(row["followerCounts"]["organicFollowerCount"])
          formatted_row.append(row["followerCounts"]["paidFollowerCount"]
          data.append(formatted_row)
      data = np.array(data)
      

      这将为您提供您在此处拥有的数据的 ndarray,但这仍然是一个丑陋的解决方案。确实,这是一种非常不切实际的数据展示方式,您应该放弃它,换一种更好的方式。

      最后一件事:不要使用驼色箱。这是某些语言(如 Java)的标准做法,但对 Python 来说不是。而不是organicFollowerCount 使用organic_follower_count 等等。

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 1970-01-01
        • 2022-11-01
        • 2013-09-01
        • 1970-01-01
        • 2021-03-31
        • 2015-08-07
        • 2019-08-03
        • 2020-12-15
        相关资源
        最近更新 更多