这里已经有很多类似的查询,但是似乎找不到与我需要的查询相匹配的查询。我有一个pandas数据框,它主要包含合同名称列,以及包含许多合同价格数据的值。
df_yldchg.head(3)
Out[392]:
ticker RXH16 Comdty RXM16 Comdty RXU16 Comdty IKH16 Comdty IKM16 Comdty \
field PX_LAST PX_LAST PX_LAST PX_LAST PX_LAST
date
2016-01-04 NaN NaN NaN NaN NaN
2016-01-05 1.875658 1.960696 2.538501 4.386991 3.393998
2016-01-06 4.596182 4.729410 5.814771 2.722861 2.102244
ticker IKU16 Comdty contract_month year rolled_IK rolled_RX
field PX_LAST
date
2016-01-04 NaN H 16 IKH16 Comdty RXH16 Comdty
2016-01-05 4.065628 H 16 IKH16 Comdty RXH16 Comdty
2016-01-06 2.523455 H 16 IKH16 Comdty RXH16 Comdty
我想添加一个列,例如在列“ rolled_RX”中查找的“ RX_yldchange”将其与列标题匹配,并从该列(同一行)获取值。
列名和数据来自数据库查询,并且随着时间的推移将使用新列进行更新,因此我需要该调用与动态检查所有列而不是硬编码兼容。这类似于excel中的“ index(Match())”调用,我敢肯定有一种简单的方法,但是我在这里浏览了很多问题,但没有找到答案。
EDIT2:我已经尝试过在其他地方找到的查找调用:
----> 1 df_yldchg['RX_yldchange'] = df_yldchg.lookup(df_yldchg.index,
df_yldchg['rolled_RX'])
~\Anaconda3\lib\site-packages\pandas\core\frame.py in lookup(self,
row_labels, col_labels)
3474 result = np.empty(n, dtype='O')
3475 for i, (r, c) in enumerate(zip(row_labels, col_labels)):
-> 3476 result[i] = self._get_value(r, c)
3477
3478 if is_object_dtype(result):
~\Anaconda3\lib\site-packages\pandas\core\frame.py in _get_value(self, index,
col, takeable)
2530 return com._maybe_box_datetimelike(series._values[index])
2531
-> 2532 series = self._get_item_cache(col)
2533 engine = self.index._engine
2534
~\Anaconda3\lib\site-packages\pandas\core\generic.py in _get_item_cache(self,
item)
2484 res = cache.get(item)
2485 if res is None:
-> 2486 values = self._data.get(item)
2487 res = self._box_item_values(item, values)
2488 cache[item] = res
~\Anaconda3\lib\site-packages\pandas\core\internals.py in get(self, item,
fastpath)
4124 raise ValueError("cannot label index with a null
key")
4125
-> 4126 return self.iget(loc, fastpath=fastpath)
4127 else:
4128
~\Anaconda3\lib\site-packages\pandas\core\internals.py in iget(self, i,
fastpath)
4141 Otherwise return as a ndarray
4142 """
-> 4143 block = self.blocks[self._blknos[i]]
4144 values = block.iget(self._blklocs[i])
4145 if not fastpath or not block._box_to_block_values or values.ndim
!= 1:
TypeError: only integer scalar arrays can be converted to a scalar index
如果这不是多索引数据框,是否有可能奏效?我很高兴摆脱列名的第二层(“ PX_LAST”),如果有帮助的话。
@screenpaver:
df_yldchg.columns
Out[413]:
MultiIndex(levels=[['IKH16 Comdty', 'IKM16 Comdty', 'IKU16 Comdty', 'RXH16
Comdty', 'RXM16 Comdty', 'RXU16 Comdty', 'contract_month', 'year',
'rolled_IK', 'rolled_RX'], ['PX_LAST', '']],
labels=[[3, 4, 5, 0, 1, 2, 6, 7, 8, 9], [0, 0, 0, 0, 0, 0, 1, 1,
1, 1]],
names=['ticker', 'field'])
提前谢谢!