如何锁定始终满足条件的数据框?

时间:2019-09-19 23:09:45

标签: pandas dataframe for-loop filter conditional-statements

我具有以下数据框,并且尝试编写脚本以在时间列下打印数字“ 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

有什么好的方法可以实现这一目标?

谢谢

2 个答案:

答案 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。