非常感谢。我是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
任何帮助和指针都将不胜感激。我确实考虑过使用数组,但是它很复杂,因为值在每行而不是列上。我想错了吗?非常感谢!
答案 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的列。然后,您可以调整第一个功能以适合每个组。