Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一列中保留第一个值,而另一列等于一个值?_Python_Loops_Pandas_Dataframe_List Comprehension - Fatal编程技术网

Python 在一列中保留第一个值,而另一列等于一个值?

Python 在一列中保留第一个值,而另一列等于一个值?,python,loops,pandas,dataframe,list-comprehension,Python,Loops,Pandas,Dataframe,List Comprehension,我希望在一列中保留第一个值,而另一列不等于零。对于B列,值在-1、0和1之间交替。对于C列,值等于任何整数。目标是在B列等于零时保持C列的第一个值。当前数据帧如下所示: A B C 1 8 1 9 2 2 1 1 3 3 0 7 4 9 0 8 5 5 0 9 6 6 0 1 7 1 1 9 8 6 1 10 9 3 0 4 10 8 0 8 11 5 0 9 12 6 0 10 A B C

我希望在一列中保留第一个值,而另一列不等于零。对于B列,值在-1、0和1之间交替。对于C列,值等于任何整数。目标是在B列等于零时保持C列的第一个值。当前数据帧如下所示:

   A  B C 
1  8  1 9  
2  2  1 1  
3  3  0 7  
4  9  0 8  
5  5  0 9  
6  6  0 1  
7  1  1 9  
8  6  1 10 
9  3  0 4  
10 8  0 8  
11 5  0 9  
12 6  0 10 
   A  B C 
1  8  1 9  
2  2  1 1  
3  3  0 7  
4  9  0 7  
5  5  0 7  
6  6  0 7  
7  1  1 9  
8  6  1 10 
9  3  0 4  
10 8  0 4  
11 5  0 4  
12 6  0 4 
13 3  1 9 
生成的数据帧应如下所示:

   A  B C 
1  8  1 9  
2  2  1 1  
3  3  0 7  
4  9  0 8  
5  5  0 9  
6  6  0 1  
7  1  1 9  
8  6  1 10 
9  3  0 4  
10 8  0 8  
11 5  0 9  
12 6  0 10 
   A  B C 
1  8  1 9  
2  2  1 1  
3  3  0 7  
4  9  0 7  
5  5  0 7  
6  6  0 7  
7  1  1 9  
8  6  1 10 
9  3  0 4  
10 8  0 4  
11 5  0 4  
12 6  0 4 
13 3  1 9 

您需要首先在列
C
中按条件创建
NaN
s,然后按
ffill
添加值:

mask = (df['B'].shift().fillna(False)).astype(bool) | (df['B'])
df['C'] = df.loc[mask, 'C']
df['C'] = df['C'].ffill().astype(int)
print (df)
    A  B   C
1   8  1   9
2   2  1   1
3   3  0   7
4   9  0   7
5   5  0   7
6   6  0   7
7   1  1   9
8   6  1  10
9   3  0   4
10  8  0   4
11  5  0   4
12  6  0   4
13  3  1   9
或者使用,如果所有值的类型都是整数,则添加
astype

mask = (df['B'].shift().fillna(False)).astype(bool) | (df['B'])
df['C'] = df['C'].where(mask).ffill().astype(int)
print (df)
    A  B   C
1   8  1   9
2   2  1   1
3   3  0   7
4   9  0   7
5   5  0   7
6   6  0   7
7   1  1   9
8   6  1  10
9   3  0   4
10  8  0   4
11  5  0   4
12  6  0   4
13  3  1   9

两种解决方案在实施时都是正确的。谢谢,我很感激!我认为没有,因为缺少9:(检查新的解决方案我没有找到,谢谢。出于我的目的,此解决方案有效,因为C列是计算新值的辅助列。在B列最后一个0值下方延伸的行中似乎存在不匹配,这可能是由于B列上的移位。再次感谢!