Python 更改每第二行中的值-大熊猫

Python 更改每第二行中的值-大熊猫,python,pandas,Python,Pandas,我的目标是改变一行中每一行的值。使用下面的命令,我希望在组中每隔一行更改一次。组中每组两行将始终重复。然而,这种情况发生的方式是随机的。如中所示,我不会将每一行更改为特定的值。更改的方法取决于前一行中的值 具体而言,每组行将包含来自GR1或GR2的唯一值。我希望将组中的第二个值更改为第一个值不是的值。因此,使用下文,第一行将是A或B。因此,后面的行将是相反的值 注意:对于每个时间段,只会有两个重复的行。此外,GR1或GR2中的唯一值将根据数据集的不同而不同,因此我希望对此进行说明 df = pd

我的目标是改变一行中每一行的值。使用下面的命令,我希望在
组中每隔一行更改一次。
中每组两行将始终重复。然而,这种情况发生的方式是随机的。如中所示,我不会将每一行更改为特定的值。更改的方法取决于前一行中的值

具体而言,每组行将包含来自
GR1
GR2
的唯一值。我希望将
组中的第二个值更改为第一个值不是的值。因此,使用下文,第一行将是
A
B
。因此,后面的行将是相反的值


注意:对于每个
时间段
,只会有两个重复的行。此外,
GR1
GR2
中的唯一值将根据数据集的不同而不同,因此我希望对此进行说明

df = pd.DataFrame({      
    'Time' : [1,1,2,2,3,3,4,4],    
    'GR1' : ['A','A','A','A','A','A','A','A'],
    'GR2' : ['B','B','B','B','B','B','B','B'],
    'Group' : ['A','A','B','B','B','B','A','A'],    
   })

GR1 = df['GR1'].unique()
GR2 = df['GR2'].unique() 

groups = [y for x in [GR1, GR2] for y in x] 

df['Group'] = np.where(df.index % 2, groups[0], groups[1])
df:

输出:

预期产出:

   Time GR1 GR2 Group
0     1   A   B     A
1     1   A   B     B
2     2   A   B     B
3     2   A   B     A
4     3   A   B     B
5     3   A   B     A
6     4   A   B     A
7     4   A   B     B

其思想是为最后三列中的每一列获取第二行,根据您的逻辑进行比较,并用逻辑的结果替换原始数据帧

DT = df.copy()

DT.iloc[1::2, -1] = np.nan 

# the second rows will be filled with the values from the previous row
DT = DT.ffill()

In [252]: gr1 = DT.iloc[1::2, 1]

In [253]: gr2 = DT.iloc[1::2, 2]

In [258]: check = DT.iloc[1::2, -1]
 
In [260]: bool1 = gr1==check

In [261]: bool2 = gr2==check

In [264]: condlist = [bool1, bool2]

In [265]: choicelist = [gr2, gr1]

In [267]: DT.iloc[1::2, -1] = np.select(condlist, choicelist)

In [268]: DT
Out[268]: 
   Time GR1 GR2 Group
0     1   A   B     A
1     1   A   B     B
2     2   A   B     B
3     2   A   B     A
4     3   A   B     B
5     3   A   B     A
6     4   A   B     A
7     4   A   B     B

你说随机是什么意思?我添加了更多信息。我指的是随机排序。因此,不会将第二行更改为相同的值。如果在
时间
中每个组有两行以上的行会怎么样?每个
时间将只有两行重复的行
在给定的时间内,我们是否只能得到一行。比如说,对于时间=3,我们能让索引=4而不是索引=5吗?换句话说,我们总共有7条记录,
Time==3
,只有一行
   Time GR1 GR2 Group
0     1   A   B     A
1     1   A   B     B
2     2   A   B     B
3     2   A   B     A
4     3   A   B     B
5     3   A   B     A
6     4   A   B     A
7     4   A   B     B
DT = df.copy()

DT.iloc[1::2, -1] = np.nan 

# the second rows will be filled with the values from the previous row
DT = DT.ffill()

In [252]: gr1 = DT.iloc[1::2, 1]

In [253]: gr2 = DT.iloc[1::2, 2]

In [258]: check = DT.iloc[1::2, -1]
 
In [260]: bool1 = gr1==check

In [261]: bool2 = gr2==check

In [264]: condlist = [bool1, bool2]

In [265]: choicelist = [gr2, gr1]

In [267]: DT.iloc[1::2, -1] = np.select(condlist, choicelist)

In [268]: DT
Out[268]: 
   Time GR1 GR2 Group
0     1   A   B     A
1     1   A   B     B
2     2   A   B     B
3     2   A   B     A
4     3   A   B     B
5     3   A   B     A
6     4   A   B     A
7     4   A   B     B