Python 熊猫:从另一列的子集词典创建列

Python 熊猫:从另一列的子集词典创建列,python,pandas,Python,Pandas,我正在使用三种不同风格的json文件 主要区别在于,一些字段,dmaKey和dmaDescription存在于其中一列的字典外部或内部,或者根本不存在 例如,将我的文件从json转换为df时,此数据帧的输出是正确的 file_2 = [{'weekStartDate': '2019-09-02', 'dmaKey': '803', 'dmaDescription': 'Los Angeles', 'scxRequiredFields': {'dmaPopulation': 54768

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

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

例如,将我的文件从json转换为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
我的两个问题是如何检查
dmaKey
dmaDescription
是否不存在于上述相同的文件结构中,如果是这种情况,我如何匹配上述输出,从
scxRequiredFields
字典列中抓取
dmaKey
dmaDescription
,创建它们自己的列

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
有时
dmaKey
dmaDescription
也会完全缺失,所以这是我需要考虑的第三种情况

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

我认为这是在创建数据文件之前操作数据的问题。这里有一些代码可以实现这一点:

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)
下面是您可以如何调用该方法(无论如何,这是我的测试代码):

调用
populateValues()
的结果是操作数据结构
test
,以便在顶级字典中填充任何缺少的键

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

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

keys = ('dmaKey','dmaDescription')
for test in ( file_2, file_3, file_1 ):
  populateValues( test, keys )
  json.dump( test, sys.stdout, indent = 2 )
  print()
  print()
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"
  }
]