我有一个已经旋转的数据框,看起来像下面这样。
var regex1 = /&myparameter\[(.*?)\]=/g;
var regex2 = /\]=(.*?)\&/g;
var input = '&myparameter[123]=1&myparameter[678]=4&otherthings=rtz';
var match;
var y = [];
do {
match = regex1.exec(input);
match2 = regex2.exec(input);
if (match) {
var x = match[1];
var c = match2[1];
var y = ';' + x + ';' + c;
console.log(y);
}
} while (match);
以上显示了与从制造商处购买商品相关的成本和运输费用以及以成本和费用计算的货币。
我想要做的是汇总数字并将它们置于货币之下。所需的输出是(我已经未加评估,因此很清楚它的来源)
.icon-button {
position: relative;
}
.icon-button button {
position: absolute;
top: 0; left: 0;
}
我试过了
Cost Transport Currency
Manufacturer ABC XYZ ABC XYZ ABC XYZ
Date
2017-07-01 312 323 31 41 Pounds Pounds
2017-07-02 423 335 21 32 Dollars Pounds
2017-07-03 421 304 21 21 Dollars Pounds
Pandas根本不喜欢给出KeyError。
这是获取起始数据帧的代码,df。在实际使用案例中,绝对需要首先调整数据以进行分析和聚合,因此请不要建议在my_list或df_raw上应用数据透视表。
Currency
Dollars Pounds
Date
2017-07-01 0 312+323+31+41
2017-07-02 423+21 335+32
2017-07-03 421+21 304+21
答案 0 :(得分:1)
使用stack
,groupby
,sum
,unstack
:
使用您的设置和输入数据框:
my_list = ["2017-07-01", "ABC",312, 31, "Pounds", "2017-07-01", "XYZ" ,323, 41, "Pounds",
"2017-07-02", "ABC", 423, 21, "Dollars", "2017-07-02", "XYZ" ,335, 32, "Pounds",
"2017-07-03", "ABC", 421, 21, "Dollars", "2017-07-03", "XYZ", 304, 21, "Pounds" ]
df_raw = pd.DataFrame(np.array(my_list).reshape(6,5),
columns = ["Date", "Manufacturer", "Cost", "Transport", "Currency"])
df = df_raw.pivot(index='Date', columns='Manufacturer')
df = df.apply(pd.to_numeric,errors='ignore')
重塑数据框并计算:
df.stack().groupby(['Date','Currency']).sum().sum(1).unstack(fill_value=0)
输出:
Currency Dollars Pounds
Date
2017-07-01 0 707
2017-07-02 444 367
2017-07-03 442 325
答案 1 :(得分:0)
编辑2:修订
df2 = df.stack()
df2['total'] = df2['Cost'] + df2['Transport']
df2.reset_index(inplace = True)
df2.pivot_table(index = 'Date', columns = 'Currency', values = 'total', aggfunc = np.sum, fill_value = 0)
编辑:以下答案实际上是不可接受的。会尝试修改......
单程......
df_raw['total_cost'] = df_raw['Cost'] + df_raw['Transport']
df_raw.pivot_table(index = 'Date', columns = 'Currency', values = ['total_cost'], aggfunc = 'sum', fill_value = 0)