我具有以下数据框,并且尝试编写脚本以在时间列下打印数字“ 5”,“ 5”是“ col”始终保持为1的值。
import pandas as pd
df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10], 'col': [0,1,0,0,1,1,1,1,1,1]})
print(df)
time col
0 1 0
1 2 1
2 3 0
3 4 0
4 5 1
5 6 1
6 7 1
7 8 1
8 9 1
9 10 1
有什么好的方法可以实现这一目标?
谢谢
答案 0 :(得分:1)
我了解到您正在寻找这样的东西:
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
cond2=(cond1.eq(False))&(cond1.shift(-1).eq(True))
df['time']=df['time'].where(cond2|(~cond1)).ffill().fillna(df['time'])
print(df)
time col
0 1.0 0
1 2.0 1
2 3.0 0
3 4.0 0
4 5.0 1
5 5.0 1
6 5.0 1
7 5.0 1
8 5.0 1
9 5.0 1
说明:
使用cond1选择必须替换的值
print(cond1)
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
9 True
Name: col, dtype: bool
使用cond2选择应该替换的值
print(cond2)
0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 False
9 False
Name: col, dtype: bool
到真实数据集:
df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 'col': [0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1]})
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
print(df)
time col
0 1 0
1 2 0
2 3 0
3 4 1
4 5 1
5 6 1
6 7 0
7 8 0
8 9 0
9 10 0
10 11 0
11 12 1
12 13 1
13 14 1
14 15 1
15 16 1
16 17 1
17 18 1
18 19 1
19 20 1
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
cond2=(cond1.eq(False))&(cond1.shift(-1).eq(True))
df['time']=df['time'].where(cond2|(~cond1)).ffill().fillna(df['time'])
print(df)
time col
0 1.0 0
1 2.0 0
2 3.0 0
3 4.0 1
4 4.0 1
5 4.0 1
6 7.0 0
7 8.0 0
8 9.0 0
9 10.0 0
10 11.0 0
11 12.0 1
12 12.0 1
13 12.0 1
14 12.0 1
15 12.0 1
16 12.0 1
17 12.0 1
18 12.0 1
19 12.0 1
答案 1 :(得分:0)
这是真实的数据集
df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 'col': [0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1]})
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
df['cond1'] = cond1
print(df)
Output
time col cond1
0 1 0 False
1 2 0 False
2 3 0 False
3 4 1 False
4 5 1 True
5 6 1 True
6 7 0 False
7 8 0 False
8 9 0 False
9 10 0 False
10 11 0 False
11 12 1 False
12 13 1 True
13 14 1 True
14 15 1 True
15 16 1 True
16 17 1 True
17 18 1 True
18 19 1 True
19 20 1 True
我的意图是确定时间13。