我在使用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中的新手并且在迭代列中遇到困难
答案 0 :(得分:2)
我认为您需要辅助列count
,然后groupby
和agg
首先需要first
和sum
。然后你需要按掩码df.A == 1
进行子集,最后你可以drop
列A
和count
:
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