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

时间:2017-06-06 13:54:31

标签: python loops pandas dataframe list-comprehension

我想在列中保留第一个值,而另一列不等于零。对于B列,值在-1,0,1之间交替。对于C列,值等于任何整数。目标是保持C列的第一个值,而B列等于零。当前的DataFrame如下:

   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 

生成的DataFrame应如下所示:

   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 

1 个答案:

答案 0 :(得分:1)

您需要先在NaN列中按条件创建C,然后按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

或者使用where,如果所有值的类型都是整数,请添加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