2017-06-09 4 views
1

次のようにIは、データフレームとデータフレーム.groupby().cumsum()を有する:Groupby .cumsum()は、合計の列がゼロに等しい場合は空白ですか?

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

Col_Bの和はdf.groupby(['Col_A'])['Col_B'].cumsum()あります。ただし、Col_B == 0の場合、.cumsum()は空白です。 Col_Bが空白の場合でも​​を記録するにはどうすればよいですか?

結果DATAFRAMEが似ている必要があります。

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

答えて

1

を私はあなたがboolean indexingまたはqueryによる最初のフィルタが必要だと思う:

df['Col_C'] = df[df['Col_B'] != 0].groupby(['Col_A'])['Col_B'].cumsum() 
print (df) 
    Col_A Col_B Col_C 
1  A  0 NaN 
2  A  1 1.0 
3  A  1 2.0 
4  A  1 3.0 
5  B  0 NaN 
6  B  1 1.0 
7  B  0 NaN 
8  B  1 2.0 
9  C  1 1.0 
10  C  1 2.0 
11  C  1 3.0 
12  C  0 NaN 

または:

df['Col_C'] = df.query('Col_B != 0').groupby(['Col_A'])['Col_B'].cumsum() 
print (df) 
    Col_A Col_B Col_C 
1  A  0 NaN 
2  A  1 1.0 
3  A  1 2.0 
4  A  1 3.0 
5  B  0 NaN 
6  B  1 1.0 
7  B  0 NaN 
8  B  1 2.0 
9  C  1 1.0 
10  C  1 2.0 
11  C  1 3.0 
12  C  0 NaN 

そして最後でNaN Sを置き換えますffill(メソッド= 'ffill'の)。

df['Col_C'] = df['Col_C'].ffill().fillna(0).astype(int) 
print (df) 
    Col_A Col_B Col_C 
1  A  0  0 
2  A  1  1 
3  A  1  2 
4  A  1  3 
5  B  0  3 
6  B  1  1 
7  B  0  1 
8  B  1  2 
9  C  1  1 
10  C  1  2 
11  C  1  3 
12  C  0  3 
+0

DataFrame.cumsum(axis=None, skipna=True, *args, **kwargs) Return cumulative sum over requested axis. skipna : boolean, default True Exclude NA/null values. If an entire row/column is NA, the result will be NA 
この解決策は正しいです。私は、.groupby()の後の.ffill()がおそらく正しいと考えました。ありがとう! –

+1

うれしい助けてよかった週末! – jezrael

1

0の列を持つことは完全に空白の列を持つと同じではありません。しかし、まだ最初の値intfillna、最後の変換の列に置き換えられNaN秒を取得。 カラムにNAsがある場合、そのカラムの.cumsum()は実際にはNA(言い換えれば '空白')にする必要があります。 列全体がNAであるかどうかを確認し、それに応じて値を設定できます。

Documentation:実施よう

関連する問題