遍历熊猫的数据框行并比较列上的值

时间:2018-10-16 14:18:23

标签: python arrays pandas numpy

非常感谢。我是python新手,这比我想的要难。

我有一个数组[m,n],其中m是玩家的名称(0-9),n是年份(A-E)。我在每一行都标记了“ 1”,表示该球员是否被带入了之前的团队比赛(如果没有,则为“ 0”)。为此,我想创建一些分组/类。

  A B C D E
0 1 0 0 1 0
1 1 0 1 0 0
2 0 0 1 1 1
3 1 1 1 1 1
4 0 1 1 0 0
5 0 1 1 1 0
6 1 1 0 1 1
7 0 0 0 0 1
8 1 0 1 1 0
9 1 1 0 1 1

对类的一些编辑: 1.第一次参加(a)组 2.仍处于特玛状态,并连续数年(b) 3.仍在团队中,但断断续续(c) 4.不在团队中,但是在(d)之前去过那里 5.永远不要进入(e)团队

想法是为每个类提供函数,然后将其编译为一个函数。

例如,这是Class A的示例代码:

class_a=[]
for (i, row) in test.iterrows():
    if (test.iloc[i, -1]==1):
        if (test.iloc[i, 0:-2].sum(axis=0))==0:
            class_a.append('Yes')

但是,Class b的示例代码要困难一些:

test1=[]
count=0

for (i, row) in test.iterrows():
    row = test.iloc[i, 0:-1]
    for j in range(0, len(row)-1):
        if row[j]>=row[j+1]:
            print(i, row[j], row[j+1], 'Yes')
            count+=1
print(count)

当我打印i的结果,row [j]和row [j + 1]时,得到以下值不正确。我推断出行值的插入不正确,因为我错过了行之间的索引(j值)。计数似乎还可以(即使计数错了):

0 1 0 Yes
0 0 0 Yes
1 1 0 Yes
1 1 0 Yes
2 0 0 Yes
2 1 1 Yes
3 1 1 Yes
3 1 1 Yes
3 1 1 Yes
4 1 1 Yes
4 1 0 Yes
5 1 1 Yes
5 1 1 Yes
6 1 1 Yes
6 1 0 Yes
7 0 0 Yes
7 0 0 Yes
7 0 0 Yes
8 1 0 Yes
8 1 1 Yes
9 1 1 Yes
9 1 0 Yes
22

任何帮助和指针都将不胜感激。我确实考虑过使用数组,但是它很复杂,因为值在每行而不是列上。我想错了吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

一种方法是使用pandas DataFrame.apply。对于每个组,您首先要创建一个函数,该函数根据其历史记录来告诉您玩家是否在组中,然后在每一行中应用此函数。例如,对于第一个示例,您可以定义:

def first_time_in_team(series):
    return( (series.iloc[:-1].max()==0) and (series.iloc[-1]==1))

如果该球员直到今年和本年度不在团队中,则此函数返回True,否则返回false。 然后你会做:

group_first_time = df.apply(first_time_in_team,axis = 1)

其中df是包含您的数组的数据帧。 这将为您提供一个带有索引的系列播放器列表,以及一个如果值为if则为true的列,否则为false的列。然后,您可以调整第一个功能以适合每个组。