【问题标题】:Summing values in read_csv Python在 read_csv Python 中求和值
【发布时间】:2016-02-10 23:07:18
【问题描述】:

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

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 求和以获得相等的名称,因此输出应该类似于名称:{first of B: sum(C for this A)}。 我需要为 A 中的每个 1 补丁单独计算一个总和。 例如,aa的第一个1出现在第二行,所以我们为此取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 新手,一直在遍历列

【问题讨论】:

  • 为了证明你已经尝试过,你能用一个简单的代码示例来说明你到底在哪里卡住了吗?
  • 还有,要明白,为什么是2:3+6而不是2:3和5:6,是不是因为中间没有A=0?
  • 首先我从 for i in table('Name'): for j in table('A): for k in table('B'): for z in table(' C'): while j==1: sum('C') code 但后来我得到了它的谵妄,并修改了数据透视表,但仍然没有成功

标签: python pandas


【解决方案1】:

我认为您需要帮助列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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2015-01-28
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2019-03-17
    • 2015-02-17
    相关资源
    最近更新 更多