对不起,如果以前有人问过这个问题(我只能找到对前面的行有效的方法,而不是数据帧的其余部分).
我目前正试图将我的迭代方法转换为对Pandas (和时间)更友好的版本.问题如下:我有两列,"A"和"B",它们都是球员.每一次,"A"和"B"都具有不同的任意值.我想添加第三列,该列的值为"A WINS!"或者"B赢了!"基于该行的值下面的行.
来决定什么时候‘A获胜!’对于某个行号,我想将该行"A"列中的值与该行下面的"B"列中的每个值进行比较.为了确定什么时候‘B获胜!’,我想做同样的事情:获取行"B"中的值,并将其与该条目下面的列"A"中的每个条目进行比较.最先与另一列中的值"匹配"的将是胜利者.下面是一个例子:
Time | A | B | Winner |
---|---|---|---|
1 | 2 | 4 | A wins! |
2 | 3 | 5 | B wins! |
3 | 5 | 2 | A wins! |
4 | 6 | 5 | None |
5 | 2 | 10 | B wins! |
6 | 10 | 7 | None |
在时间1,A获胜,因为在时间3,"B"在"A"可以取值4之前取值2.在时间2,"B"取胜,因为下面一行中的"A"取值5,而"B"取值3.时间3和5类似,在时间4和时间6,没有赢家,因为在后面的回合中,对手的牌手不会碰巧相互取值.
现在,我只需使用df.iterrow()就有了一个有效的解决方案.我有一个相当大的数据集,所以我想加快速度,但我想不出任何简单的Panda函数,因为它们通常是逐行隔离的.由于对行的依赖,我所有的Apply和maptry 都没有奏效,所以我正在寻找一种可能减少时间且不必使用显式迭代的解决方案.感谢任何人的帮助,谢谢!
编辑:这是我的工作迭代解决方案.我向findwinner提供了一个DataFrame,它对每一行调用findwinner_row.
def find_winner_row(df, row, result):
A_val = df['A'][row] # Player A
B_val = df['B'][row] # Player B
potentials_B = np.where(df['A'][row+1:] == B_val)[0] #[row+1:] slices and only considers the future values of A
potentials_A = np.where(df['B'][row+1:] == A_val)[0]
# below logic is just to handle the case when there are no matching values
if potentials_B.size == 0:
B_switch_time = len(df.columns) + 1
else:
B_switch_time = potentials_B[0]
if potentials_A.size == 0:
A_switch_time = len(df.columns) + 1
else:
A_switch_time = potentials_A[0]
# now which is first?
if B_switch_time < A_switch_time:
result[row] = "B"
elif B_switch_time > A_switch_time:
result[row] = "A"
else:
result[row] = "None"
def find_winner(df):
result_series = pd.Series(np.zeros(len(df.columns)))
for num, (index, row) in enumerate(df.iterrows()):
find_winner_row(df, num, result_series)
df.loc[:,'Winner'] = result_series.values
return df
## So with our given example above, we can run the following and see we get the expected result
demo_df = pd.DataFrame([[2,4],[3,5],[5,2],[6,5],[2,10],[10,7]],columns=['A','B'])
find_winner(demo_df)