【问题标题】:rotate/pivot a table from long to wide in pandas and create column of difference between previous columns在熊猫中从长到宽旋转/旋转表格并创建前列之间的差异列
【发布时间】:2021-02-02 16:18:24
【问题描述】:

我有一张如下所示的表格:

> data = {'index':[0,1,2,3],'column_names':['foo_1','foo_2','bar_1','bar_2'], 'Totals':[1050,400,450,300]}

我想做三件事:

  1. 将“列名”列中的每一行转换为实际的列名。
  2. 创建一个附加列,其值为 ('foo_1' and 'foo_2') 和 ('bar_1' and 'bar_2') 的值之差
  3. 这也需要是一个如下所示的数据框对象: data_t = {'foo_1':[1050],'foo_2':[400],'Foo % Diff':[650],'bar_1':[450],'bar_2':[300],'Bar % Diff':[150]}

真的很感激如何做到这一点和解释。

【问题讨论】:

  • 你试过什么?也请看看如何在这个网站上provide reproducible sample data
  • @StargazingFish 请通过单击答案旁边的复选标记来接受答案之一作为解决方案。谢谢!

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


【解决方案1】:
  1. 您需要.groupby 才能在s1 中获得与diff().abs() 的区别
  2. 然后,您需要.groupby 来获取s2concat s1 和s2 中的总列的名称。
  3. 从那里,appends1s2 的结果转换为数据帧,并使用.T 将数据帧转置 将索引设置为column_names,因此值在column_names 显示为列标题,而不是在第一行,如果没有 .set_index(),会发生这种情况:

data = {'column_names':['foo_1','foo_2','bar_1','bar_2'], 'Totals':[1050,400,450,300]}
df = pd.DataFrame(data)
s = df['column_names'].str.split('_').str[0]
s1 = df.groupby(s)['Totals'].diff().abs()
s2 = df.groupby(s)['column_names'].apply(lambda x: x.str.split('_').str[0] + '__% Diff')
df = (df.append(pd.concat([s1,s2], axis=1).dropna())
      .sort_values('column_names').set_index('column_names').T)
df.columns = df.columns.str.replace('__', ' ') # the column name was chosen carefully to preserve order and then you can simply replace __ with a space
df
Out[1]: 
column_names  bar_1  bar_2  bar % Diff   foo_1  foo_2  foo % Diff
Totals        450.0  300.0       150.0  1050.0  400.0       650.0 

或者,如果您正在使用pct_change() 查找百分比变化:

data = {'column_names':['foo_1','foo_2','bar_1','bar_2'], 'Totals':[1050,400,450,300]}
df = pd.DataFrame(data)
s = df['column_names'].str.split('_').str[0]
s1 = df.groupby(s)['Totals'].apply(lambda x: x.pct_change())
s2 = df.groupby(s)['column_names'].apply(lambda x: x.str.split('_').str[0] + '__% Diff')
df = (df.append(pd.concat([s1,s2], axis=1).dropna())
      .sort_values('column_names').set_index('column_names').T)
df.columns = df.columns.str.replace('__', ' ') # the column name was chosen carefully to preserve order and then you can simply replace __ with a space
df
Out[2]: 
column_names  bar_1  bar_2  bar % Diff   foo_1  foo_2  foo % Diff
Totals        450.0  300.0   -0.333333  1050.0  400.0   -0.619048

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2023-01-24
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多