熊猫:从其他列的值填充新列

时间:2018-10-28 23:43:51

标签: python pandas dataframe pivot

我有一个SEC报告的pandas.dataframe,用于多个行情和时段。

DF的可复制字典:

{'Unnamed: 0': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
 'field': {0: 'taxonomyid',
  1: 'cik',
  2: 'companyname',
  3: 'entityid',
  4: 'primaryexchange'},
 'value': {0: '50',
  1: '0000023217',
  2: 'CONAGRA BRANDS INC.',
  3: '6976',
  4: 'NYSE'},
 'ticker': {0: 'CAG', 1: 'CAG', 2: 'CAG', 3: 'CAG', 4: 'CAG'},
 'cik': {0: 23217, 1: 23217, 2: 23217, 3: 23217, 4: 23217},
 'dcn': {0: '0000023217-18-000009',
  1: '0000023217-18-000009',
  2: '0000023217-18-000009',
  3: '0000023217-18-000009',
  4: '0000023217-18-000009'},
 'fiscalyear': {0: 2019, 1: 2019, 2: 2019, 3: 2019, 4: 2019},
 'fiscalquarter': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1},
 'receiveddate': {0: '10/2/2018',
  1: '10/2/2018',
  2: '10/2/2018',
  3: '10/2/2018',
  4: '10/2/2018'},
 'periodenddate': {0: '8/26/2018',
  1: '8/26/2018',
  2: '8/26/2018',
  3: '8/26/2018',
  4: '8/26/2018'}}

“字段”列包含报告字段的名称(例如指标),“值”列包含该指标的值。其他列是SEC归档的描述(ticker + date + fiscal_periods =描述某些归档的唯一功能集)。每次提交大约有60-70个指标(数量有所不同)。

使用下面的代码,我设法创建了带有column = features的数据透视数据框(假设1次提交的N个总数)。但是,此数据帧的长度也等于指标的数量= N,其中NaN位于非对角位置。

# Adf - Initial dataframe
c = Adf.pivot(columns='field', values='value')
d = Adf[['ticker','cik','fiscalyear','fiscalquarter','dcn','receiveddate','periodenddate']]
e = pd.concat([d, c], sort=False, axis=1)

我想使用“字段”中的指标名称作为新列(从窄格式到宽格式)。最后,我希望每个SEC报告都有一个带有1行的数据框。 因此,所提供示例的预期输出是带有N个新列的1行数据帧,其中N =初始数据帧的“字段”列中的唯一指示符数:

{'ticker': {0: 'CAG'},
 'cik': {0: 23217},
 'dcn': {0: '0000023217-18-000009'},
 'fiscalyear': {0: 2019},
 'fiscalquarter': {0: 1},
 'receiveddate': {0: '10/2/2018'},
 'periodenddate': {0: '8/26/2018'},
 'taxonomyid':{0:'50'},
 'cik': {0: '0000023217}',
 'companyname':{0: 'CONAGRA BRANDS INC.'},
 'entityid':{0:'6976'},
 'primaryexchange': {0:'NYSE'},

}

从中创建此类列的正确方法是什么,或者从多个NaN清除结果数据帧的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

对我有用的是为DF设置新索引并取消堆积“字段”和“值”列

aa = Adf.set_index(['ticker','cik', 'fiscalyear','fiscalquarter',  'dcn','receiveddate', 'periodenddate', 'field']).unstack()
aa = aa.reset_index()