Python 从现有数据框列名创建新的数据框列

Python 从现有数据框列名创建新的数据框列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据框(stockData),它有三种不同类型的数据(按日期索引)的库存数据,分别是LAST、VOLUME和MKTCAP 这是数据帧的头部(stockData) 是否有一种方法可以将这些字段中的一个字段用于所有股票使用新的post fix(_HOLIDAY)从该数据创建一组新的列,因此我最终得到: BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME BBG.XLON.BTA.S_MKTCAP BBG.XLON.BTA.S_

我有一个数据框(stockData),它有三种不同类型的数据(按日期索引)的库存数据,分别是LAST、VOLUME和MKTCAP

这是数据帧的头部(stockData)

是否有一种方法可以将这些字段中的一个字段用于所有股票使用新的post fix(_HOLIDAY)从该数据创建一组新的列,因此我最终得到:

              BBG.XLON.BTA.S_LAST  BBG.XLON.BTA.S_VOLUME  BBG.XLON.BTA.S_MKTCAP  BBG.XLON.BTA.S_HOLIDAY  \
date                                                                            
2001-01-02                  572               26605510               37494.60                   NaN  
2001-01-03                  560               24715470               36708.00                   NaN  
2001-01-04                  613               52781855               40182.15                   NaN  
2001-01-05                  630               56600152               41296.50                   NaN  
2001-01-08                  633               41014402               41493.15                   NaN  

            BBG.XLON.VOD.S_LAST  BBG.XLON.VOD.S_VOLUME  BBG.XLON.VOD.S_MKTCAP  BBG.XLON.VOD.S_HOLIDAY  
date                                                                           
2001-01-02                  NaN                    NaN                    NaN                   NaN  
2001-01-03               225.00              444328736            145216.0020                   NaN  
2001-01-04               239.00              488568000            154251.6643                   NaN  
2001-01-05               242.25              237936704            156349.2288                   NaN  
2001-01-08               227.75              658059776            146990.8642                   NaN 
非常感谢您的帮助。

您可以使用获取列名,然后在最后一个点(.)之后删除子字符串:

这里我假设您的数据帧被称为
df
。 这将导致名称重复(对于
.S\u LAST
.S\u VOLUME
.S\u MKTCAP
)。现在,您可以使用删除重复项:

import numpy as np
uNames=np.unique(names)
现在,您可以添加新列
.S\u HOLIDAY
来指定NaN值:

for n in uNames:
   df[n+'.S_HOLIDAY']=np.NaN
这就是你想要的吗

In [56]: newcols = df.columns.str.replace(r'\.S_.*','.S_HOLIDAY').unique().tolist()

In [57]: newcols
Out[57]: ['BBG.XLON.BTA.S_HOLIDAY', 'BBG.XLON.VOD.S_HOLIDAY']
然后,您可以轻松添加新列:

In [65]: for col in newcols:
   ....:         df[col] = np.nan
   ....:

In [66]: df
Out[66]:
            BBG.XLON.BTA.S_LAST  BBG.XLON.BTA.S_VOLUME  BBG.XLON.BTA.S_MKTCAP  \
2001-01-02                  572               26605510               37494.60
2001-01-03                  560               24715470               36708.00
2001-01-04                  613               52781855               40182.15
2001-01-05                  630               56600152               41296.50
2001-01-08                  633               41014402               41493.15

            BBG.XLON.VOD.S_LAST  BBG.XLON.VOD.S_VOLUME  BBG.XLON.VOD.S_MKTCAP  \
2001-01-02                  NaN                    NaN                    NaN
2001-01-03               225.00            444328736.0            145216.0020
2001-01-04               239.00            488568000.0            154251.6643
2001-01-05               242.25            237936704.0            156349.2288
2001-01-08               227.75            658059776.0            146990.8642

            BBG.XLON.BTA.S_HOLIDAY  BBG.XLON.VOD.S_HOLIDAY
2001-01-02                     NaN                     NaN
2001-01-03                     NaN                     NaN
2001-01-04                     NaN                     NaN
2001-01-05                     NaN                     NaN
2001-01-08                     NaN                     NaN
如果列的顺序对您很重要,您可以按如下方式重新排序:

df = df[ordered_column_list]
In [65]: for col in newcols:
   ....:         df[col] = np.nan
   ....:

In [66]: df
Out[66]:
            BBG.XLON.BTA.S_LAST  BBG.XLON.BTA.S_VOLUME  BBG.XLON.BTA.S_MKTCAP  \
2001-01-02                  572               26605510               37494.60
2001-01-03                  560               24715470               36708.00
2001-01-04                  613               52781855               40182.15
2001-01-05                  630               56600152               41296.50
2001-01-08                  633               41014402               41493.15

            BBG.XLON.VOD.S_LAST  BBG.XLON.VOD.S_VOLUME  BBG.XLON.VOD.S_MKTCAP  \
2001-01-02                  NaN                    NaN                    NaN
2001-01-03               225.00            444328736.0            145216.0020
2001-01-04               239.00            488568000.0            154251.6643
2001-01-05               242.25            237936704.0            156349.2288
2001-01-08               227.75            658059776.0            146990.8642

            BBG.XLON.BTA.S_HOLIDAY  BBG.XLON.VOD.S_HOLIDAY
2001-01-02                     NaN                     NaN
2001-01-03                     NaN                     NaN
2001-01-04                     NaN                     NaN
2001-01-05                     NaN                     NaN
2001-01-08                     NaN                     NaN
df = df[ordered_column_list]