这是一种方法:
首先创建一个仅包含 Item1 和 Item2 的字符串的行。
In [11]: df['Items'] = df.apply(lambda row: row['Item1'] + row['Item2'], axis=1)
In [12]: df
Out[12]:
Item1 Item2 Moves Items
1 A B 1 AB
2 A C 2 AC
3 B D 3 BD
4 C A 1 CA
5 C B 5 CB
6 D B 4 DB
7 D C 1 DC
如果Items
是(按字母顺序)离开它,否则切换它并取反Moves
:
In [13]: df[['Items','Moves']] = df.apply(lambda row: (row[['Items', 'Moves']])
if row['Items'][0] <= row['Items'][1]
else (row['Items'][::-1], -row['Moves']),
axis=1)
In [14]: df
Out[14]:
Item1 Item2 Moves Items
1 A B 1 AB
2 A C 2 AC
3 B D 3 BD
4 C A -1 AC
5 C B -5 BC
6 D B -4 BD
7 D C -1 CD
In [15]: g = df.groupby('Items')
In [16]: g.sum()
Out[16]:
Moves
Items
AB 1
AC 1
BC -5
BD -1
CD -1
大多数情况下,这对你来说可能就足够了。
要获得所需的最终输出,一种骇人听闻的方式可能是:
In [17]: df1 = g.first() # the first row in each group
In [18]: df1.Moves = g.sum()
In [19]: df2 = df1.reset_index(drop=True)
In [20]: df2
Out[20]:
Item1 Item2 Moves
0 A B 1
1 A C 1
2 C B -5
3 B D -1
4 D C -1
但是,请注意否定并不完全正确(对于那些错误的方式,例如 DC 而不是 CD):
In [21]: df2.Moves = df2.apply(lambda row: row['Moves']
if row['Item1'] <= row['Item2']
else -row['Moves'],
axis=1)
In [22]: df2
Out[22]:
Item1 Item2 Moves
0 A B 1
1 A C 1
2 C B 5
3 B D -1
4 D C 1