2016-02-10 36 views
0

我有一個表在CSV使用熊貓:在read_csv總結值的Python

Name  A B C 
aa  0 5 7 
aa  1 2 3 
aa  1 5 6 
aa  0 8 9 
aa  1 8 9 
aa  1 8 9 
ab  0 8 9 
ab  1 8 9 
ab  1 8 9 
ab  1 8 9 
ac  0 8 9 
ac  0 8 9 

什麼,我需要做的是薩姆所有的C平等的名稱;如果A = 1,所以輸出應該是這樣的名稱:{B的第一個:sum(C爲這個A)}。 我需要爲A中每個1的補丁單獨求和。 例如,aa的前1個出現在第二行,因此我們將B取爲此(此處爲2),然後取C。我們轉到下一行,A = 1,然後我們將C與前一個C(從第二行開始)相加。第4個A = 0,所以我們不要拿這個字符串並繼續。第五屆A = 1了,所以我們再次做的第一步:保持B = 8,總結所有具有下一個C A = 1 例如,

aa: {2:3+6, 8:9+9} //here 2 is B when A=1 for the first time 
ab: {8: 9+9+9} 
ac: {*nothing, because no 1*} 

我知道這很容易,但我新的Python和卡住了通過列

+0

證明你已經嘗試過了,你能告訴我你正在被一個簡單的c卡住嗎?例如? –

+0

也明白,爲什麼是2:3 + 6而不是2:3和5:6,是不是因爲中間沒有A = 0? –

+0

首先我開始與 **爲i的表( '名稱'): 在表J中( 'A): 用於表K(' B '): 針對z在表(' C'): while j == 1: sum('C')**'code' 但後來我得到了它的deli妄,並且在數據透視表上做了一些修補,但仍然沒有成功 – Polly

回答

2

迭代我認爲你需要幫手列count,然後groupbyfirstsumagg第一個值。然後,你需要通過面罩df.A == 1子集,最後你可以dropAcount

df['count'] = (df['A'].diff(1) != 0).astype('int').cumsum() 
print df 
    Name A B C count 
0 aa 0 5 7  1 
1 aa 1 2 3  2 
2 aa 1 5 6  2 
3 aa 0 8 9  3 
4 aa 1 8 9  4 
5 aa 1 8 9  4 
6 ab 0 8 9  5 
7 ab 1 8 9  6 
8 ab 1 8 9  6 
9 ab 1 8 9  6 
10 ac 0 8 9  7 
11 ac 0 8 9  7 
df = df.groupby(['Name','A', 'count']).agg({'B' : 'first', 'C' : 'sum'}).reset_index() 
print df 
    Name A count C B 
0 aa 0  1 7 5 
1 aa 0  3 9 8 
2 aa 1  2 9 2 
3 aa 1  4 18 8 
4 ab 0  5 9 8 
5 ab 1  6 27 8 
6 ac 0  7 18 8 

df = df[df.A == 1] 
print df 
    Name A count C B 
2 aa 1  2 9 2 
3 aa 1  4 18 8 
5 ab 1  6 27 8 

df = df.drop(['A','count'], axis=1) 
print df 
    Name C B 
2 aa 9 2 
3 aa 18 8 
5 ab 27 8 

我如何獲得列count

print df['A'].diff(1) 
0 NaN 
1  1 
2  0 
3  -1 
4  1 
5  0 
6  -1 
7  1 
8  0 
9  0 
10 -1 
11  0 
Name: A, dtype: float64 

print df['A'].diff(1) != 0 
0  True 
1  True 
2  False 
3  True 
4  True 
5  False 
6  True 
7  True 
8  False 
9  False 
10  True 
11 False 
Name: A, dtype: bool 
print (df['A'].diff(1) != 0).astype('int') 
0  1 
1  1 
2  0 
3  1 
4  1 
5  0 
6  1 
7  1 
8  0 
9  0 
10 1 
11 0 
Name: A, dtype: int32 

print (df['A'].diff(1) != 0).astype('int').cumsum() 
0  1 
1  2 
2  2 
3  3 
4  4 
5  4 
6  5 
7  6 
8  6 
9  6 
10 7 
11 7 
Name: A, dtype: int32 
+0

謝謝!多數民衆贊成我需要:) – Polly

+0

你可以[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)解決方案?謝謝。 – jezrael