Pandas DF:将数字行的总和作为字符串转换为新列

时间:2018-07-03 04:13:27

标签: python pandas

好吧,我很困惑,已经浏览了所有可用的页面,然后全部浏览,仍然很麻烦! 这是我的df。我想将第4行中的所有值加在一起,并在末尾有一行总计,然后对5、6、7进行...我使用.concat().sum()并得到关键错误许多参数,尝试过.groupby,甚至还有.add()(值得一试),因为这些列是“列表”,没有任何东西可以求和。

     1day     2day     3day     4day     5day     6day     7day
4   2.979    2.979    2.979    2.979    2.979    2.979    2.979
5   9.543    9.543    9.543    9.543    9.543    9.543    9.543
6   5.222    5.222    5.222    5.222    5.222    5.222    5.222
7   0.319    0.319    0.319    0.319    0.319    0.319    0.319
10 -4.491   -4.491   -4.491   -4.491   -4.491   -4.491   -4.491
14  2.178    2.178    2.178    2.178    2.178    2.178    2.178
15  7.507    7.507    7.507    7.507    7.507    7.507    7.507
16  0.612    0.612    0.612    0.612    0.612    0.612    0.612
17  4.488    4.488    4.488    4.488    4.488    4.488    4.488

我对df.groupby(df.index)[['1day','2day'...'7day'].sum()感到很幸运,但它只是将它们推到一起,而不是相加。 (我知道所有值都相等) 在excel中,sum(a1:g1)但是在熊猫中,我只是在写一个更深的洞,请帮忙! screen shot of df, may be a better view

1 个答案:

答案 0 :(得分:1)

.sum()应用于字符串的DF

在不更改原始问答的情况下...这是您修改后的问题的更新答案:

问题在于您需要将字符串转换为整数。这只是一个两步过程。我将显示所有步骤,以使其清晰明了:

In [83]: str_lst =[[ '7',  '3',  '2', '-1',  '5',  '8',  '0'],
                [ '6',  '8',  '4',  '0',  '8',  '7',  '6'],
                [ '6',  '1',  '2',  '8',  '6', '-1',  '2'],
                [ '0', '-1',  '3',  '5',  '1',  '3',  '7'],
                [ '6',  '5',  '2',  '8',  '4',  '2',  '3'],
                [ '4', '-1', '-1',  '3',  '2',  '3', '-1'],
                [ '8',  '6',  '6',  '0',  '8',  '0',  '0'],
                ['-1',  '3',  '3',  '0',  '4',  '2',  '4'],
                [ '2',  '1',  '2',  '7',  '0',  '8',  '5'],
                [ '3',  '8',  '1',  '0',  '8',  '1',  '8']]

In [85]: df = pd.DataFrame(str_lst, columns=['1day', '2day', 
                  '3day', '4day', '5day', '6day', '7day'])

In [93]: df = df.apply(pd.to_numeric)

In [94]: df['Totals'] = df.sum(axis =1)

如果在pd.to_numeric之前进行总计,则为字符串的总和。如果您在pd.to_numeric之后进行总计,则为整数的总和。

原始回应

创建DF之后。试试:

df['Totals'] = df.sum(axis=1)

这将在最右边添加一列,其中包含所有行。

示例

In [63]: df = pd.DataFrame(np.random.randint(-1,9,size=(10, 7)),
             columns=['1day', '2day', '3day', '4day', 
                      '5day', '6day', '7day'])

In [64]: df
Out[64]: 
   1day  2day  3day  4day  5day  6day  7day
0     0     0     7    -1     2     2    -1
1     0     3     3     2    -1     3     6
2     0     8     0    -1     8    -1     1
3     3     8    -1     2     6     3     8
4     5     0     1     8     8    -1     3
5     7     8     1     4     8     1     8
6     5     7     5    -1     7    -1     1
7     6     3     2     2     8     1     5
8     3     7     3     3     3    -1     1
9     2    -1     8     1     1     0     5

In [65]: df['Totals'] = df.sum(axis=1)

In [66]: df
Out[66]: 
   1day  2day  3day  4day  5day  6day  7day  Totals
0     0     0     7    -1     2     2    -1       9
1     0     3     3     2    -1     3     6      16
2     0     8     0    -1     8    -1     1      15
3     3     8    -1     2     6     3     8      29
4     5     0     1     8     8    -1     3      24
5     7     8     1     4     8     1     8      37
6     5     7     5    -1     7    -1     1      23
7     6     3     2     2     8     1     5      27
8     3     7     3     3     3    -1     1      19
9     2    -1     8     1     1     0     5      16