熊猫:将多列汇总为一列,没有最后一列

Posted

技术标签:

【中文标题】熊猫:将多列汇总为一列,没有最后一列【英文标题】:Pandas: sum up multiple columns into one column without last column 【发布时间】:2017-06-23 03:42:39 【问题描述】:

如果我有一个类似于这个的数据框

Apples   Bananas   Grapes   Kiwis
2        3         nan      1
1        3         7        nan
nan      nan       2        3

我想添加这样的列

Apples   Bananas   Grapes   Kiwis   Fruit Total
2        3         nan      1        6
1        3         7        nan      11
nan      nan       2        3        5

我猜你可以使用df['Apples'] + df['Bananas'] 等等,但我的实际数据框比这大得多。我希望像df['Fruit Total']=df[-4:-1].sum 这样的公式可以在一行代码中解决问题。然而这并没有奏效。有没有办法在不明确总结所有列的情况下做到这一点?

【问题讨论】:

看那里。 ***.com/questions/25748683/… 【参考方案1】:

您可以先选择iloc,然后再选择sum

df['Fruit Total']= df.iloc[:, -4:-1].sum(axis=1)
print (df)
   Apples  Bananas  Grapes  Kiwis  Fruit Total
0     2.0      3.0     NaN    1.0          5.0
1     1.0      3.0     7.0    NaN         11.0
2     NaN      NaN     2.0    3.0          2.0

所有列的总和使用:

df['Fruit Total']= df.sum(axis=1)

【讨论】:

优秀。 iloc 是我一直在寻找的东西。 这个答案没有添加最后一列,因此有点混乱。 @JinhuaWang - 标题已更改。 哦,好吧,对不起【参考方案2】:

可以在不知道列数甚至没有 iloc 的情况下做到这一点:

print(df)
   Apples  Bananas  Grapes  Kiwis
0     2.0      3.0     NaN    1.0
1     1.0      3.0     7.0    NaN
2     NaN      NaN     2.0    3.0

cols_to_sum = df.columns[ : df.shape[1]-1]

df['Fruit Total'] = df[cols_to_sum].sum(axis=1)

print(df)
   Apples   Bananas Grapes  Kiwis   Fruit Total
0  2.0      3.0     NaN     1.0     5.0
1  1.0      3.0     7.0     NaN     11.0
2  NaN      NaN     2.0     3.0     2.0

【讨论】:

我喜欢这个,因为如果我决定扩展我的数据框,它不需要重新编码【参考方案3】:

这可能对初学者有帮助,所以为了完整起见,如果您知道列名(例如它们在列表中),您可以使用:

column_names = ['Apples', 'Bananas', 'Grapes', 'Kiwis']
df['Fruit Total']= df[column_names].sum(axis=1)

这使您可以灵活地选择使用哪些列,因为您只需操作列表column_names,并且您可以执行诸如仅选择名称中带有字母“a”的列之类的操作。这样做的另一个好处是,人们更容易通过列名了解他们在做什么。将此与 list(df.columns) 结合使用,以列表格式获取列名。因此,如果您想删除最后一列,您所要做的就是:

column_names = list(df.columns)
df['Fruit Total']= df[column_names[:-1]].sum(axis=1)

【讨论】:

【参考方案4】:

在原始 df 上使用 df['Fruit Total']= df.iloc[:, -4:-1].sum(axis=1) 不会添加最后一列('Kiwis'),您应该使用 df.iloc[:, -4:] 来选择所有列:

print(df)
   Apples  Bananas  Grapes  Kiwis
0     2.0      3.0     NaN    1.0
1     1.0      3.0     7.0    NaN
2     NaN      NaN     2.0    3.0

df['Fruit Total']=df.iloc[:,-4:].sum(axis=1)

print(df)
   Apples  Bananas  Grapes  Kiwis  Fruit Total
0     2.0      3.0     NaN    1.0          6.0
1     1.0      3.0     7.0    NaN         11.0
2     NaN      NaN     2.0    3.0          5.0

【讨论】:

感谢您的回答。但是,我不明白在 iloc 语句中使用负号有什么好处。 iloc[:,1,5] 似乎是一种更简单且不易混淆的方式。我正在学习 Python 和 Pandas。通过反复试验,我意识到 iloc[1:4] 只是对前 3 列求和,而 iloc[:,1,5] 对前 4 列求和 使用 iloc[:,-4] 你告诉它最后 4 列。在这种情况下,iloc[:,-4] = iloc[:,1,5]。您使用哪一种取决于您希望在陈述中体现的具体程度或开放程度。【参考方案5】:

如果您想在不知道数据框的形状/大小的情况下得出总数,我想以 Ramon 的回答为基础。 我将在下面使用他的答案,但修复一个不包括总数最后一列的项目。 我已经从形状中删除了 -1:

cols_to_sum = df.columns[ : df.shape[1]-1]

到这里:

cols_to_sum = df.columns[ : df.shape[1]]
print(df)
   Apples  Bananas  Grapes  Kiwis
0     2.0      3.0     NaN    1.0
1     1.0      3.0     7.0    NaN
2     NaN      NaN     2.0    3.0

cols_to_sum = df.columns[ : df.shape[1]]

df['Fruit Total'] = df[cols_to_sum].sum(axis=1)

print(df)
   Apples   Bananas Grapes  Kiwis   Fruit Total
0  2.0      3.0     NaN     1.0     6.0
1  1.0      3.0     7.0     NaN     11.0
2  NaN      NaN     2.0     3.0     5.0

这会在不跳过最后一列的情况下为您提供正确的总数。

【讨论】:

以上是关于熊猫:将多列汇总为一列,没有最后一列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框按列位置分组

为一列熊猫数据框着色

如何删除熊猫数据框的最后一列数据

将列索引从0重命名为最后一列熊猫

熊猫按多列排名

如何计算熊猫数据框中每一列的唯一性?