[英]pandas pivot table, creating table by taking difference of multiple columns
我有這個具有2級列過濾器的數據透視表。
table_pivot = pandas.pivot_table(table_raw, values='PRICE', index=['DATE', 'HOUR'],
columns=['TYPE', 'ID'], aggfunc= numpy.mean, fill_value= 0)
output pivot看起來像這樣:
TYPE type X type Y
ID X1 X2 X3 Y1 Y2 Y3 Y4
DATE HOUR
1/1/2015 1 10 20 30 20 40 60 80
1/1/2015 2 20 40 60 10 50 70 90
現在我試圖獲得類型之間的差異,使得預期輸出看起來像這樣:
Z
Y1 - X1 Y1 - X2 Y1 - X3 Y1 - X1 Y2 - X1 ....
Date Hour
1/1/2015 1 10 20 30 40 30 ...
1/1/2015 2 -10 30 50 70 -30 ...
我以為它會是這樣的:
table_pivot['Z'] = table_pivot['Y'] - table['X']
但似乎它不起作用。 如何創建新表以獲得所有可能的XY組合之間的差異?
更新:我嘗試了以下幾行。 但是,我一直在收到MemoryError
消息。 有誰知道如何解決這個問題?
x_list = table_pivot['X'].columns.values
y_list = table_pivot['Y'].columns.values
table_diff = pandas.DataFrame()
for each_x in x_list:
for each_y in y_list:
colName = each_y + ' - ' + each_x
table_diff[colName] = table_pivot['Y'][each_y] - table_pivot['X'][each_x]
一個多索引切片,sub()和concat的情況。
df = pd.DataFrame({('Y', 'Y4'): {('1/1/2015', 2L): 90, ('1/1/2015', 1L): 80}, ('X', 'X1'): {('1/1/2015', 2L): 20, ('1/1/2015', 1L): 10}, ('X', 'X2'): {('1/1/2015', 2L): 40, ('1/1/2015', 1L): 20}, ('X', 'X3'): {('1/1/2015', 2L): 60, ('1/1/2015', 1L): 30}, ('Y', 'Y3'): {('1/1/2015', 2L): 70, ('1/1/2015', 1L): 60}, ('Y', 'Y1'): {('1/1/2015', 2L): 10, ('1/1/2015', 1L): 20}, ('Y', 'Y2'): {('1/1/2015', 2L): 50, ('1/1/2015', 1L): 40}})
df.columns = pd.MultiIndex.from_tuples([('X','X1'), ('X','X2'), ('X','X3'),('Y','Y1'), ('Y','Y2'), ('Y','Y3'), ('Y', 'Y4')])
df.index.names = ['DATE','ID']
print df
X Y
X1 X2 X3 Y1 Y2 Y3 Y4
DATE ID
1/1/2015 1 10 20 30 20 40 60 80
2 20 40 60 10 50 70 90
idx = pd.IndexSlice
collection = []
for tup in filter(lambda x: x[0] == "Y", df.columns.tolist()):
foo = -1 * df.loc[:,idx['X',:]].sub(df.loc[:,tup],axis=0)
foo.columns = [str(tup[1]) + '-' + col for col in foo.columns.get_level_values(1)]
collection.append(foo)
print pd.concat(collection,axis=1)
Y1-X1 Y1-X2 Y1-X3 Y2-X1 Y2-X2 Y2-X3 Y3-X1 Y3-X2 Y3-X3 Y4-X1 Y4-X2 Y4-X3
DATE ID
1/1/2015 1 10 0 -10 30 20 10 50 40 30 70 60 50
2 -10 -30 -50 30 10 -10 50 30 10 70 50 30
可能更好的方法是為每個變量使用時間序列數據幀,然后創建另一個數據框,其中包含變量之間的差異。
data = pd.read_csv('file_path', index_column)
#assuming data is in date-time format
data.index() = pd.to_datetime(data.index())
xvars = data.type['X']
yvars = data.type['Y']
然后使用相同的for循環邏輯來獲取Yi-Xi並將其存儲在新的數據幀中。
保持對象簡單可能不會引發內存錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.