当这些列的名称与列表中的名称匹配时,如何跨熊猫列添加所有值?

Posted

技术标签:

【中文标题】当这些列的名称与列表中的名称匹配时,如何跨熊猫列添加所有值?【英文标题】:How to add all values across pandas columns when the names of these columns match those in a list? 【发布时间】:2019-04-19 03:10:55 【问题描述】:
list = ['abc', 'def_1', 'xyz_8']

下面是df 的示例行

abc_1     abc_99    def_1     def_2    xyz_8    xyz_1
2         1         1         2        2        3

我想根据列表仅扫描并选择部分df 列。列表元素可以是列名的子字符串。例如,列abc_1 将被包含,因为abc 是一个子字符串,但xyz_1 不包括在内,因为xyz_1 不是列表的元素,并且列表元素都不是xyz_1 的子字符串。

我想要该行的 df['sum'] = 6(或 2+1+1+2)。

【问题讨论】:

【参考方案1】:

filter / str.contains

您可以使用filterstr.contains,两者都支持正则表达式:

L = ['abc', 'def_1', 'xyz_8']

# courtesy of @JonClements
df['result'] = df.filter(regex='|'.join(L)).sum(1)

# original
df['result'] = df.iloc[:, df.columns.str.contains('|'.join(L))].sum(1)

print(df)

   abc_1  abc_99  def_1  def_2  xyz_8  xyz_1  result
0      2       1      1      2      2      3       6

【讨论】:

或者df['result'] = df.filter(regex='|'.join(L)).sum(1) @JonClements,是的,这实际上更好,谢谢:) - 虽然我不确定这里哪个更快 天真地,我希望过滤器总是返回一个视图,而 .iloc 可能会或可能不会返回一个副本(永远不记得什么必须复制和什么不复制的规则.. .(熊猫也没有——考虑到所有关于“你正在尝试......”的警告)......(现在有点太累了,无法真正研究它——这只是我最初的想法(而且很可能是错误的,但是哦,好吧)) 大部分都理解了这条线,但是 .sum() 中的“1”到底是什么意思? @KubiK888, axis=1 表示跨列总和,as described in the docs

以上是关于当这些列的名称与列表中的名称匹配时,如何跨熊猫列添加所有值?的主要内容,如果未能解决你的问题,请参考以下文章

跨 PySpark DataFrame 列的字符串匹配

使用熊猫列表中的项目名称

如何在大熊猫数据框中显示所有列的名称?

如何解决Outlook配置用户邮箱 “该名称不能与地址列表中的名称匹配”错误

仅当 UID 与 Firebase Firestore 中的集合名称匹配时,如何读取集合?

如何使用熊猫根据列的值范围分离数据框?