下面是做這件事:
首先創建一個只包含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
這是大多數的方式,並可以爲你就夠了。
以獲得所需的最終輸出一個hackey方式可以是:
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
重要的是你首先看到的過渡方向是否被保留,或者是否有'B C -5'的行是可以接受的? – DSM 2013-02-21 16:27:29
這不是那麼重要,但我想它是一個優先選擇刪除第一次遇到兩個轉換還是第二個轉換的問題。 – BigScratch 2013-02-21 16:43:50