【问题标题】:Create a list of columns and sum them in a new column with Pandas (Python)使用 Pandas (Python) 创建一个列列表并将它们汇总到一个新列中
【发布时间】:2019-07-28 18:06:51
【问题描述】:

我确实知道有些帖子与我的问题非常相似,但没有一个能成功地给我正确的答案。对于 pandas 数据帧的每一行,我希望执行从几列中获取的值的总和。由于列数往往会有所不同,因此我希望从列列表中执行此总和。

目前我的代码如下所示:

df['Sum'] = df['Col A'] + df['Col E'] + df['Col Z']

我希望它是这样的:

df['Sum'] = sum(list_of_my_columns)

df[list_of_my_columns].sum(axis=1)

但是它们都返回错误。可能是因为我的列表没有正确创建?我就是这样做的:

list_of_my_columns = [df['Col A'], df['Col E'], df['Col Z']]

但这似乎不起作用......有什么想法吗?谢谢!

【问题讨论】:

  • df[list_of_my_columns].sum(axis=1)
  • 谢谢,但我已经尝试过了,它返回一个索引错误:-(

标签: python python-3.x pandas jupyter-notebook jupyter-lab


【解决方案1】:

您不需要列列表。您需要一个列名列表:

list_of_my_columns = ['Col A', 'Col E', 'Col Z']
df['Sum'] = df[list_of_my_columns].sum(axis=1)

【讨论】:

  • 谢谢!你正确地指出了我的错误!使用列名比创建新的 df 更有效。 :)
  • 仅供参考,产生 SettingWithCopyWarning Pandas 警告:A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead. 请参阅文档中的警告:pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
【解决方案2】:

让我写一个答案

list_of_my_columns = [df['Col A'], df['Col E'], df['Col Z']]

使用concat

df['Sum']=pd.concat(list_of_my_columns,axis=1 ).sum(axis=1)

【讨论】:

  • 像魅力一样工作谢谢!因此,您使用 pd.concat 函数创建了一个仅包含我的列的临时数据框,对吧?两个问题: - 当我创建列列表时,它们是否在变量中重复,这意味着它们在 RAM 中占用更多空间? - 与使用 pd.concat 生成的 df 相同,新数据帧是否也占用内存空间?还是在计算总和后立即销毁?
【解决方案3】:

您所要做的就是创建一个Series(它是pandas 中的一列)并将每一行的总和附加到Series。然后只需将系列添加到数据框中。

import pandas as pd

df = pd.read_csv('input.csv', header=None)
col = pd.Series()

for i, row in df.iterrows():
    col.set_value(i, (row[0] + row[1] + row[2]))

df = df.assign(sum=col)

print(df)

【讨论】:

  • 当你在 pandas 中使用逐行循环时,你几乎肯定做错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2016-03-10
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多