[英]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.