计数直到在 Pandas 内达到条件
Count until condition is reached in Pandas
我需要你的一些意见。我的想法是,我想看看需要多长时间(以行为单位)才能看到
SUB_B1
列中的新值,并且
SUB_B2
中的新值
即中间有多少步
SUB_A1
和 SUB B1
,以及
- 介于
SUB A2
和 SUB B2
之间
我将数据结构化如下:(我按结果列降序排列索引。之后我将索引 B 和 A 分开并将它们放在新列中)
df.sort_values(['A','result'], ascending=[True,False]).set_index(['A','B'])
result
SUB_A1
SUB_A2
SUB_B1
SUB_B2
A
B
10_125
10_173
0.903257
10
125
10
173
10_332
0.847333
10
125
10
332
10_243
0.842802
10
125
10
243
10_522
0.836335
10
125
10
522
58_941
0.810760
10
125
58
941
...
...
...
...
...
...
10_173
10_125
0.903257
10
173
10
125
58_941
0.847333
10
173
58
941
1_941
0.842802
10
173
1
941
96_512
0.836335
10
173
96
512
10_513
0.810760
10
173
10
513
这是我到目前为止所做的:(编辑:我想我需要遍历 values[]
但是,我还没有设法超出第一行...)
def func(group):
if group.SUB_A1.values[0] == group.SUB_B1.values[0]:
group.R1.values[0] = 1
else:
group.R1.values[0] = 0
if group.SUB_A1.values[0] == group.SUB_B1.values[1] and group.R1.values[0] == 1:
group.R1.values[1] = 2
else:
group.R1.values[1] = 0
df['R1'] = 0
df.groupby('A').apply(func)
预期结果:
result
SUB_B1
SUB_B2
R1
R2
A
B
10_125
10_173
0.903257
10
173
1
0
10_332
0.847333
10
332
2
0
10_243
0.842802
10
243
3
0
10_522
0.836335
10
522
4
0
58_941
0.810760
58
941
0
0
...
...
...
...
...
...
尝试使用 pandas.DataFrame.iterrows and pandas.DataFrame.shift。
您可以遍历数据帧并将当前行与前一行进行比较,然后添加一些条件:
df['SUB_A2_last'] = df['SUB_A2'].shift()
count = 0
#Fill column with zeros
df['count_series'] = 0
for index, row in df.iterrows():
subA = row['sub_A2']
subA_last = row['sub_A2_last']
if subA == subA_last:
count += 1
else:
count = 0
df.loc[index, 'count_series'] = count
然后对 B 列重复上述操作。使用 pandas.DataFrame.apply 和自定义函数可以获得更好的方法。
您是否正在寻找这样的东西:
示例数据框:
df = pd.DataFrame(
{"SUB_A": [1, -1, -2, 3, 3, 4, 3, 6, 6, 6],
"SUB_B": [1, 2, 3, 3, 3, 3, 4, 6, 6, 6]},
index=pd.MultiIndex.from_product([range(1, 3), range(1, 6)], names=("A", "B"))
)
SUB_A SUB_B
A B
1 1 1 1
2 -1 2
3 -2 3
4 3 3
5 3 3
2 1 4 3
2 3 4
3 6 6
4 6 6
5 6 6
现在这个
equal = df.SUB_A == df.SUB_B
df["R"] = equal.groupby(equal.groupby("A").diff().fillna(True).cumsum()).cumsum()
导致
SUB_A SUB_B R
A B
1 1 1 1 1
2 -1 2 0
3 -2 3 0
4 3 3 1
5 3 3 2
2 1 4 3 0
2 3 4 0
3 6 6 1
4 6 6 2
5 6 6 3
噗!极好的!感谢你们的意见
def func(group):
for each in range(len(group)):
if group.SUB_A1.values[0] == group.SUB_B1.values[each]:
group.R1.values[each] = each + 1
continue
elif group.SUB_A1.values[0] == group.SUB_B1.values[each] and group.R1.values[each] == each + 1:
group.R1.values[each] = each + 1
else:
group.R1.values[each] = 0
return group
df['R1'] = 0
df.groupby('A').apply(func)
我需要你的一些意见。我的想法是,我想看看需要多长时间(以行为单位)才能看到
SUB_B1
列中的新值,并且SUB_B2
中的新值
即中间有多少步
SUB_A1
和SUB B1
,以及- 介于
SUB A2
和SUB B2
之间
我将数据结构化如下:(我按结果列降序排列索引。之后我将索引 B 和 A 分开并将它们放在新列中)
df.sort_values(['A','result'], ascending=[True,False]).set_index(['A','B'])
result | SUB_A1 | SUB_A2 | SUB_B1 | SUB_B2 | ||
---|---|---|---|---|---|---|
A | B | |||||
10_125 | 10_173 | 0.903257 | 10 | 125 | 10 | 173 |
10_332 | 0.847333 | 10 | 125 | 10 | 332 | |
10_243 | 0.842802 | 10 | 125 | 10 | 243 | |
10_522 | 0.836335 | 10 | 125 | 10 | 522 | |
58_941 | 0.810760 | 10 | 125 | 58 | 941 | |
... | ... | ... | ... | ... | ... | |
10_173 | 10_125 | 0.903257 | 10 | 173 | 10 | 125 |
58_941 | 0.847333 | 10 | 173 | 58 | 941 | |
1_941 | 0.842802 | 10 | 173 | 1 | 941 | |
96_512 | 0.836335 | 10 | 173 | 96 | 512 | |
10_513 | 0.810760 | 10 | 173 | 10 | 513 |
这是我到目前为止所做的:(编辑:我想我需要遍历 values[]
但是,我还没有设法超出第一行...)
def func(group):
if group.SUB_A1.values[0] == group.SUB_B1.values[0]:
group.R1.values[0] = 1
else:
group.R1.values[0] = 0
if group.SUB_A1.values[0] == group.SUB_B1.values[1] and group.R1.values[0] == 1:
group.R1.values[1] = 2
else:
group.R1.values[1] = 0
df['R1'] = 0
df.groupby('A').apply(func)
预期结果:
result | SUB_B1 | SUB_B2 | R1 | R2 | ||
---|---|---|---|---|---|---|
A | B | |||||
10_125 | 10_173 | 0.903257 | 10 | 173 | 1 | 0 |
10_332 | 0.847333 | 10 | 332 | 2 | 0 | |
10_243 | 0.842802 | 10 | 243 | 3 | 0 | |
10_522 | 0.836335 | 10 | 522 | 4 | 0 | |
58_941 | 0.810760 | 58 | 941 | 0 | 0 | |
... | ... | ... | ... | ... | ... |
尝试使用 pandas.DataFrame.iterrows and pandas.DataFrame.shift。
您可以遍历数据帧并将当前行与前一行进行比较,然后添加一些条件:
df['SUB_A2_last'] = df['SUB_A2'].shift()
count = 0
#Fill column with zeros
df['count_series'] = 0
for index, row in df.iterrows():
subA = row['sub_A2']
subA_last = row['sub_A2_last']
if subA == subA_last:
count += 1
else:
count = 0
df.loc[index, 'count_series'] = count
然后对 B 列重复上述操作。使用 pandas.DataFrame.apply 和自定义函数可以获得更好的方法。
您是否正在寻找这样的东西:
示例数据框:
df = pd.DataFrame(
{"SUB_A": [1, -1, -2, 3, 3, 4, 3, 6, 6, 6],
"SUB_B": [1, 2, 3, 3, 3, 3, 4, 6, 6, 6]},
index=pd.MultiIndex.from_product([range(1, 3), range(1, 6)], names=("A", "B"))
)
SUB_A SUB_B
A B
1 1 1 1
2 -1 2
3 -2 3
4 3 3
5 3 3
2 1 4 3
2 3 4
3 6 6
4 6 6
5 6 6
现在这个
equal = df.SUB_A == df.SUB_B
df["R"] = equal.groupby(equal.groupby("A").diff().fillna(True).cumsum()).cumsum()
导致
SUB_A SUB_B R
A B
1 1 1 1 1
2 -1 2 0
3 -2 3 0
4 3 3 1
5 3 3 2
2 1 4 3 0
2 3 4 0
3 6 6 1
4 6 6 2
5 6 6 3
噗!极好的!感谢你们的意见
def func(group):
for each in range(len(group)):
if group.SUB_A1.values[0] == group.SUB_B1.values[each]:
group.R1.values[each] = each + 1
continue
elif group.SUB_A1.values[0] == group.SUB_B1.values[each] and group.R1.values[each] == each + 1:
group.R1.values[each] = each + 1
else:
group.R1.values[each] = 0
return group
df['R1'] = 0
df.groupby('A').apply(func)