在read_csv Python中求和值

时间:2016-02-10 12:12:01

标签: python pandas

我在使用pandas的csv中有一个表:

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

我需要做的是如果A = 1则将所有C相加为相等的名称,因此输出应该像Name:{B中的第一个:sum(此A的C)}。 对于A中的每个补丁,我需要一个单独的总和。 例如,aa的第一个出现在第二行,所以我们为此取B(这里是2),然后取C.我们转到下一行,再次A = 1,然后我们将C与前一个C相加(从第2行)。第4个A = 0,所以我们不接受这个字符串并继续。再次第5个A = 1,所以我们再次执行第一步:保持B = 8并且总结所有下一个具有A = 1的C 例如,

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中的新手并且在迭代列中遇到困难

1 个答案:

答案 0 :(得分:2)

我认为您需要辅助列count,然后groupbyagg首先需要firstsum。然后你需要按掩码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
相关问题