我有一個價格資料的資料框,如下所示:(超過 10,000 列)
| 未命名:0 | 01973江淮三公司 | 未命名:2 | 019754AA8公司 | 未命名:4 | 01265RTJ7公司 | 未命名:6 | 01988PAD0公司 | 未命名:8 | 019736AB3公司 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2004-04-13 | 101.1 | 2008-06-16 | 99.1 | 2010-06-14 | 110.0 | 2008-06-18 | 102.1 | 鈉鹽 | NaN |
| 2 | 2004-04-14 | 101.2 | 2008-06-17 | 100.4 | 2010-07-05 | 110.3 | 2008-06-19 | 102.6 | 鈉鹽 | NaN |
| 3 | 2004-04-15 | 101.6 | 2008-06-18 | 100.4 | 2010-07-12 | 109.6 | 2008-06-20 | 102.5 | 鈉鹽 | NaN |
| 4 | 2004-04-16 | 102.8 | 2008-06-19 | 100.9 | 2010-07-19 | 110.1 | 2008-06-21 | 102.6 | 鈉鹽 | NaN |
| 5 | 2004-04-19 | 103.0 | 2008-06-20 | 101.3 | 2010-08-16 | 110.3 | 2008-06-22 | 102.8 | 鈉鹽 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | 鈉鹽 | NaN |
| 3431 | 鈉鹽 | NaN | 2021-12-30 | 119.2 | 鈉鹽 | NaN | 鈉鹽 | NaN | 鈉鹽 | NaN |
| 3432 | 鈉鹽 | NaN | 2021-12-31 | 119.4 | 鈉鹽 | NaN | 鈉鹽 | NaN | 鈉鹽 | NaN |
(這些是標題中的 9 位 CUSIP。所以每兩列代表證券的日期和收盤價。)我想
- 查找并洗掉空的日期和價格對,例如“未命名:8”和“019736AB3 corp”
- 然后將日期框架重新排列為每月收盤價的面板,如下所示:
| 日期 | 01973江淮3 | 019754AA8 | 01265RTJ7 | 01988PAD0 |
|---|---|---|---|---|
| 2004-04-30 | 102.1 | NaN | NaN | NaN |
| 2004-05-31 | 101.2 | NaN | NaN | NaN |
| ... | ... | ... | ... | ... |
| 2021-12-30 | NaN | 119.2 | NaN | NaN |
| 2021-12-31 | NaN | 119.4 | NaN | NaN |
編輯:我想澄清我的問題。
所以我的資料框有 10,000 多列,這使得無法逐列洗掉或一一更改它們的名稱。日期和價格對在不同的時間開始和結束,并且具有不同的長度(和不同的頻率)。我正在尋找一種有效的方法來將它們排列成不那么凌亂的形式。謝謝。
這是 30 列的示例。https://github.com/txd2x/datastore檔案名:sample-question2022-01.xlsx
我想出了:堆疊然后重塑。感謝幫助。
for i in np.arange(len(price.columns)/2):
temp =DataFrame(columns = ['Date', 'ClosedPrice','CUSIP'])
temp['Date'] = price.iloc[ 0:np.shape(price)[0]-1, int(2*i)]
temp['ClosedPrice'] = price.iloc[0:np.shape(price)[0]-1, int(2*i 1)]
temp['CUSIP'] =price.columns[int(i*2 1)][:9] #
df = df.append(temp)
#use for loop to stack all the column pairs
df = df.dropna(axis=0, how = 'any') # drop nan rows
df = df.pivot(index='Date', columns = 'CUSIP', values = 'ClosedPrice') #reshape dataframe to have Date as index and CUSIP and column headers
df_monthly=df.resample('M').last() #finding last price of the month
uj5u.com熱心網友回復:
如果你想擺脫無用的列,那么執行以下代碼:
df.drop("name_of_column", axis=1, inplace=True)
如果要洗掉空行,請使用:
df.drop(df.index[row_number], inplace=True)
如果要使用“時間戳和日期”重新排列資料,則需要將其轉換為日期時間物件,然后將其設為索引:
import datetime
df.Date=pd.to_datetime(df.Date)
df = df.set_index('Date')
并且您可能想在執行上述任何操作之前更改列名, df.rename(columns={'first_column': 'first', 'second_column': 'second'}, inplace = True)
Updated01:如果您只想保留那 10000 列中的一些列,例如 10 或 7 列,然后使用 df = df[["first_column","second_column", ....]]
如果要洗掉所有空列,請使用:df.dropna(axis=1, how = 'all')“how”關鍵字有兩個值:“all”洗掉整行或列,如果它充滿了 Nan,“any”洗掉整行或列,如果它有至少一楠。
Update02:現在,如果您有很多日期列并且只想保留其中一個,假設您選擇了一個沒有“Nan”值的日期列,請使用以下代碼:
columns=df.columns.tolist()
for column in columns:
try:
if(df[column].dtypes=='object'):
df[column]=pd.to_datetime(df[column]).
if(df[column].dtypes=='datetime64[ns]')&(column!='Date'):
df.drop(column,axis=1,inplace=True)
except ValueError:
pass
使用月重新排列資料框:
import datetime
df.Date=pd.to_datetime(df.Date)
df['Month']=df.Date.dt.month
df['Year']=df.Date.dt.year
df = df.set_index('Month')
df.groupby(["Year","Month"]).mean()
update03:要在保留資料的同時合并所有日期列,請使用以下代碼:
import pandas as pd
import numpy as np
df=pd.read_excel('sample_question2022-01.xlsx')
columns=df.columns.tolist()
for column in columns:
if (df[column].isnull().sum()>2300):
df.drop(column,axis=1,inplace=True)
columns=df.columns.tolist()
import itertools
count_date=itertools.count(1)
count_price=itertools.count(1)
for column in columns:
if(df[column].dtypes=='datetime64[ns]'):
df.rename(columns={column:f'date{next(count_date)}'},inplace=True)
else:
df.rename(columns={column:f'Price{next(count_price)}'},inplace=True)
columns=df.columns.tolist()
merged=df[[columns[0],columns[1]]].set_index('date1')
k=2
for i in range(2,len(columns)-1,2):
merged=pd.merge(merged,df[[columns[i],columns[i 1]]].set_index(f'date{k}'),how='outer',left_index=True,right_index=True)
k =1
唯一的問題是它會拋出一個記憶體錯誤。
MemoryError:無法為形狀為 (3677415706,) 和資料型別為 int64 的陣列分配 27.4 GiB
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/402295.html
標籤:
