首页 > 解决方案 > 熊猫:从另一列的子集字典创建列

问题描述

我正在使用三种不同风格的 json 文件。

主要区别在于一些字段,dmaKey或者dmaDescription存在于其中一列的字典之外或内部,或者根本不存在。

例如,将我的文件从 json 转换为 pandas df 时,此数据框的输出是正确的。

file_2 = [{'weekStartDate': '2019-09-02',
  'dmaKey': '803',
  'dmaDescription': 'Los Angeles',
  'scxRequiredFields': {'dmaPopulation': 5476830,
   'systemPopulation': 3810053,
   'strataMarketName': 'Los Angeles'}},
 {'weekStartDate': '2019-09-16',
  'dmaKey': '803',
  'dmaDescription': 'Los Angeles',  
  'scxRequiredFields': {'dmaPopulation': 5476830,
   'systemPopulation': 3810053,
   'strataMarketName': 'Los Angeles'}}]

df2 = pd.DataFrame(file_2)
df2

我的两个问题是如何检查与上述相同的文件结构中是否存在dmaKeydmaDescription不存在,如果是这种情况,我该如何匹配上面的输出,并从字典列中获取dmaKeyand来创建自己的专栏?dmaDescriptionscxRequiredFields

file_1 =[{'weekStartDate': '2020-08-17',
  'scxRequiredFields': {'dmaPopulation': 771210,
   'systemPopulation': 10407,
   'strataMarketName': 'Austin',
   'dmaKey': '635',
   'dmaDescription': 'Austin',
   'eclipseRegionName': 'TEXAS'}},
 {'weekStartDate': '2020-08-10',
  'scxRequiredFields': {'dmaPopulation': 771210,
   'systemPopulation': 10407,
   'strataMarketName': 'Austin',
   'dmaKey': '635',
   'dmaDescription': 'Austin',
   'eclipseRegionName': 'TEXAS'}}]

df1 = pd.DataFrame(file_1)
df1

有时也完全丢失dmaKeydmaDescription丢失,所以这是我需要考虑的第三种情况。

file_3 =[{'weekStartDate': '2020-09-17',
  'scxRequiredFields': {'dmaPopulation': 7712105432,
   'systemPopulation': 10407123,
   'strataMarketName': 'Austin',
   'eclipseRegionName': 'TEXAS'}},
 {'weekStartDate': '2020-09-10',
  'scxRequiredFields': {'dmaPopulation': 7712101234,
   'systemPopulation': 10407123,
   'strataMarketName': 'Austin',
   'eclipseRegionName': 'TEXAS'}}]

df3 = pd.DataFrame(file_3)
df3

标签: pythonpandas

解决方案


我认为这是在创建数据框之前操纵数据的问题。这是一些执行此操作的代码:

def populateValues( json_file, keys ):
  for row in json_file:
    for k in ('dmaKey','dmaDescription'):
      if k not in row:
        if 'scxRequiredFields' in row:
          row[k] = row['scxRequiredFields'].get( k , defaults(row,k) )
        else:
          row[k] = defaults(row,k)

以下是您调用该方法的方式(好吧,这是我的测试代码):

keys = ('dmaKey','dmaDescription')
for test in ( file_2, file_3, file_1 ):
  populateValues( test, keys )
  json.dump( test, sys.stdout, indent = 2 )
  print()
  print()

调用的结果populateValues()是对数据结构test进行了操作,以便将任何缺失的键填充到顶级字典中。

如果字典或“sceRequiredFields”子字典中完全缺少该值,您尚未指定要做什么。相反,我只是调用了一个函数defaults(row,k),以便该函数可以k根据行中的任何内容为给定键指定默认值。这是一个简单的函数,它只是将键名与“默认”连接起来:

def defaults( r, k ) :
  return f"Default: {k}"

这是测试循环的输出(我添加了一些注释,以便您可以看到不同的输入文件结果):

# file_2 - no fixes required
[
  {
    "weekStartDate": "2019-09-02",
    "dmaKey": "803",
    "dmaDescription": "Los Angeles",
    "scxRequiredFields": {
      "dmaPopulation": 5476830,
      "systemPopulation": 3810053,
      "strataMarketName": "Los Angeles"
    }
  },
  {
    "weekStartDate": "2019-09-16",
    "dmaKey": "803",
    "dmaDescription": "Los Angeles",
    "scxRequiredFields": {
      "dmaPopulation": 5476830,
      "systemPopulation": 3810053,
      "strataMarketName": "Los Angeles"
    }
  }
]

# file_3 - only dumb default values get inserted
[
  {
    "weekStartDate": "2020-09-17",
    "scxRequiredFields": {
      "dmaPopulation": 7712105432,
      "systemPopulation": 10407123,
      "strataMarketName": "Austin",
      "eclipseRegionName": "TEXAS"
    },
    "dmaKey": "Default: dmaKey",
    "dmaDescription": "Default: dmaDescription"
  },
  {
    "weekStartDate": "2020-09-10",
    "scxRequiredFields": {
      "dmaPopulation": 7712101234,
      "systemPopulation": 10407123,
      "strataMarketName": "Austin",
      "eclipseRegionName": "TEXAS"
    },
    "dmaKey": "Default: dmaKey",
    "dmaDescription": "Default: dmaDescription"
  }
]

# file_1 - Values are taken from scxRequiredFields
[
  {
    "weekStartDate": "2020-08-17",
    "scxRequiredFields": {
      "dmaPopulation": 771210,
      "systemPopulation": 10407,
      "strataMarketName": "Austin",
      "dmaKey": "635",
      "dmaDescription": "Austin",
      "eclipseRegionName": "TEXAS"
    },
    "dmaKey": "635",
    "dmaDescription": "Austin"
  },
  {
    "weekStartDate": "2020-08-10",
    "scxRequiredFields": {
      "dmaPopulation": 771210,
      "systemPopulation": 10407,
      "strataMarketName": "Austin",
      "dmaKey": "635",
      "dmaDescription": "Austin",
      "eclipseRegionName": "TEXAS"
    },
    "dmaKey": "635",
    "dmaDescription": "Austin"
  }
]

推荐阅读