pandas - 按列对和旋转对值进行分组

时间:2018-03-21 12:06:23

标签: python-3.x pandas

一直在努力思考在这里做什么,旋转和融化以及其他似乎没有成功的事情。我试图将来往/来自目的地的名称一起加入,然后重新排序组合名称,但这是一团糟

我的数据涉及从一个位置流向另一个位置,其格式为:

pd.DataFrame(columns=['from_location','to_location','flow'],data =[['a','b',1],['b','a',3]])
  from_location to_location  flow
0           a             b     1
1           b             a     3

但我的输出必须是格式:

pd.DataFrame(columns=['connection','flow','back flow','net'],data =[['a -> b',1,3,2]])

  connection  flow  back flow  net
0     a -> b     1          3    2

任何可以重新排列这样的东西的内置函数?我甚至不确定要搜索哪些关键字

1 个答案:

答案 0 :(得分:2)

使用:

#df = df.sort_values(['from_location','to_location'])
df1 = pd.DataFrame(np.sort(df[['from_location','to_location']], axis=1),
                   columns=list('ab'), index=df.index)
s = df1['a'] + ' -> ' + df1['b']
df2 = df.groupby(s)['flow'].agg(['first','last']).assign(net=lambda x: x['last'] - x['first'])
print (df2)
        first  last  net
a -> b      1     3    2

<强>解释

  1. 如果可能,必要时首先sort_values交换一些配对行
  2. 按行numpy.sort按行排序列,并将列与拆分器
  3. 连接在一起
  4. 然后groupby加入值并按aggfirstlast
  5. 汇总
  6. 如果需要减去列,请按assign
  7. 添加新列