【问题标题】:pandas pivot table, creating table by taking difference of multiple columns熊猫数据透视表,通过取多列的差异创建表
【发布时间】:2016-05-27 09:55:29
【问题描述】:

我有这个具有 2 级列过滤器的数据透视表。

table_pivot = pandas.pivot_table(table_raw, values='PRICE', index=['DATE', 'HOUR'],
                             columns=['TYPE', 'ID'], aggfunc= numpy.mean, fill_value= 0)

输出轴如下所示:

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']

但它似乎不起作用。如何创建一个新表来获取所有可能的 X-Y 组合之间的差异?

更新:我尝试了以下几行。但是,我收到了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]

【问题讨论】:

  • 可以添加示例数据吗?
  • @jezrael,喜欢实际的 csv 吗?样本格式和数据应该遵循第一个表,而第二个表应该模仿我要计算的内容
  • 表格有多大,您要重新处理多少变量。
  • @rgalbo 运行每个 X 和 Y 大约 60 个变量。

标签: python python-3.x pandas pivot-table


【解决方案1】:

多索引切片、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

【讨论】:

    【解决方案2】:

    更好的方法是为每个变量使用一个时间序列数据框,然后创建另一个具有变量之间差异的数据框。

    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 并将其存储在新的数据帧中。

    保持对象简单可能不会引发内存错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-28
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      相关资源
      最近更新 更多