- 您需要
.groupby 才能在s1 中获得与diff().abs() 的区别
- 然后,您需要
.groupby 来获取s2 和concat s1 和s2 中的总列的名称。
- 从那里,
append 将s1 和s2 的结果转换为数据帧,并使用.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