簡體   English   中英

pandas - 使用列名重組數據框

[英]pandas - restructuring dataframe using column names

我閱讀了以下 DataFrame,其中有許多類似於 S&PCOMP 的列,列名末尾帶有 (PO) 和 (PI) 尾部。

                      Date         S&PCOMP(PO)         S&PCOMP(PI)  NASA100(PO)    NASA100(PI)
0      1978-09-13 00:00:00                 nan              106.34  someValue      someValue 
1      1978-09-14 00:00:00                 nan  105.10000000000001  someValue      someValue
2      1978-09-15 00:00:00                 nan              104.12   
3      1978-09-18 00:00:00                 nan  103.21000000000001   
4      1978-09-19 00:00:00                 nan              102.53   
5      1978-09-20 00:00:00                 nan              101.73   
6      1978-09-21 00:00:00                 nan               101.9   
7      1978-09-22 00:00:00                 nan              101.84   
8      1978-09-25 00:00:00                 nan              101.86   
9      1978-09-26 00:00:00                 nan              102.62   
10     1978-09-27 00:00:00                 nan              101.66

我想使用正則表達式和多索引將其重組到以下 DataFrame 中,用於每個列名。 本質上,我使用 PO 和 PI 值作為 2 列,並使用列名基作為索引垂直擴展我的 DF。 如您所見,日期滾動......這意味着對於每個唯一的列名稱庫,我都有相同的天數。

                      Date                      Open               Close
S&PCOMP      1978-09-13 00:00:00                 nan              106.34   
S&PCOMP      1978-09-14 00:00:00                 nan  105.10000000000001   
S&PCOMP      1978-09-15 00:00:00                 nan              104.12   
S&PCOMP      1978-09-18 00:00:00                 nan  103.21000000000001   
S&PCOMP      1978-09-19 00:00:00                 nan              102.53   
S&PCOMP      1978-09-20 00:00:00                 nan              101.73   
S&PCOMP      1978-09-21 00:00:00                 nan               101.9   
S&PCOMP      1978-09-22 00:00:00                 nan              101.84   
S&PCOMP      1978-09-25 00:00:00                 nan              101.86   
S&PCOMP      1978-09-26 00:00:00                 nan              102.62   
S&PCOMP      1978-09-27 00:00:00                 nan              101.66
NASA100      1978-09-13 00:00:00                 someValue        someValue   
NASA100      1978-09-14 00:00:00                 someValue        someValue  

用熊貓完成這個最簡單的方法是什么? 我可以使用正則表達式嗎?

values = [['1978-09-13 0:00', 'someValue', 106.34, 'someValue', 'someValue'],
       ['1978-09-14 0:00', 'someValue', 105.1, 'someValue', 'someValue'],
       ['1978-09-15 0:00', 'someValue', 104.12, 'someValue', 'someValue'],
       ['1978-09-18 0:00', 'someValue', 103.21, 'someValue', 'someValue'],
       ['1978-09-19 0:00', 'someValue', 102.53, 'someValue', 'someValue'],
       ['1978-09-20 0:00', 'someValue', 101.73, 'someValue', 'someValue'],
       ['1978-09-21 0:00', 'someValue', 101.9, 'someValue', 'someValue'],
       ['1978-09-22 0:00', 'someValue', 101.84, 'someValue', 'someValue'],
       ['1978-09-25 0:00', 'someValue', 101.86, 'someValue', 'someValue'],
       ['1978-09-26 0:00', 'someValue', 102.62, 'someValue', 'someValue'],
       ['1978-09-27 0:00', 'someValue', 101.66, 'someValue', 'someValue']]

headers = ['Date', 'S&PCOMP(PO)', 'S&PCOMP(PI)', 'NASA100(PO)', 'NASA100(PI)']

df = pd.DataFrame(values, columns=headers)

如果您可以更改標題 -以下循環將生成新標題(新標題不是手動編碼的):

headers_new = {}
for x in list(df.columns):
    headers_new[x] = x[-4:] + x[:-4]

headers_new是前面循環的輸出。

headers_new =
{'Date': 'Date',
 'S&PCOMP(PO)': '(PO)S&PCOMP',
 'S&PCOMP(PI)': '(PI)S&PCOMP',
 'NASA100(PO)': '(PO)NASA100',
 'NASA100(PI)': '(PI)NASA100'}

df = df.rename(index=str, columns=headers_new)

然后你可以:

df_long = pd.wide_to_long(df, ['(PO)', '(PI)'], i='Date', j='stock', suffix=r'(?<=\))(.*)')


                             (PO)     (PI)
           Date   stock     
1978-09-13 0:00 S&PCOMP someValue   106.34
1978-09-14 0:00 S&PCOMP someValue   105.1
1978-09-15 0:00 S&PCOMP someValue   104.12
1978-09-18 0:00 S&PCOMP someValue   103.21
1978-09-19 0:00 S&PCOMP someValue   102.53
1978-09-20 0:00 S&PCOMP someValue   101.73
1978-09-21 0:00 S&PCOMP someValue   101.9
1978-09-22 0:00 S&PCOMP someValue   101.84
1978-09-25 0:00 S&PCOMP someValue   101.86
1978-09-26 0:00 S&PCOMP someValue   102.62
1978-09-27 0:00 S&PCOMP someValue   101.66
1978-09-13 0:00 NASA100 someValue   someValue
1978-09-14 0:00 NASA100 someValue   someValue

索引

df.columns = 
Index(['(PO)', '(PI)'], dtype='object')

df.loc[('1978-09-25 0:00')] = 

             (PO)       (PI)
  stock     
S&PCOMP someValue   101.86
NASA100 someValue   someValue

df.loc[('1978-09-25 0:00', 'S&PCOMP')] = 
(PO)    someValue
(PI)       101.86
Name: (1978-09-25 0:00, S&PCOMP), dtype: object

# or you can reset the index:

df2 = df.reset_index()

df2.columns =
Index(['Date', 'stock', '(PO)', '(PI)'], dtype='object')

df2.iloc[:3]

               Date   stock      (PO)     (PI)
0   1978-09-13 0:00 S&PCOMP someValue   106.34
1   1978-09-14 0:00 S&PCOMP someValue   105.1
2   1978-09-15 0:00 S&PCOMP someValue   104.12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM