首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pandas dataframe中以相同字符串开头的列的求和值

pandas dataframe中以相同字符串开头的列的求和值
EN

Stack Overflow用户
提问于 2016-03-02 20:09:34
回答 3查看 10.7K关注 0票数 10

我有一个大约有100列的数据帧,如下所示:

代码语言:javascript
运行
复制
Id  Economics-1  English-107  English-2  History-3  Economics-zz  Economics-2  \
0  56          1            1          0        1       0           0   
1  11          0            0          0        0       1           0   
2   6          0            0          1        0       0           1   
3  43          0            0          0        1       0           1   
4  14          0            1          0        0       1           0   

   Histo      Economics-51      Literature-re         Literatureu4  
0           1            0           1                0  
1           0            0           0                1  
2           0            0           0                0  
3           0            1           1                0  
4           1            0           0                0

我的目标是只留下全局类别--英语、历史、文学--并在这个数据框中分别写出它们组成部分的值的总和。例如,"English“将是"English-107”和“English-2”的和:

代码语言:javascript
运行
复制
Id  Economics      English    History  Literature  
0  56          1            1          2        1                     
1  11          1            0          0        1                    
2   6          0            1          1        0                     
3  43          2            0          1        1                     
4  14          0            1          1        0

为此,我尝试了两种方法。第一种方法:

代码语言:javascript
运行
复制
df = pd.read_csv(file_path, sep='\t')
df['History'] = df.loc[df[df.columns[pd.Series(df.columns).str.startswith('History')]].sum(axes=1)]

第二种方法:

代码语言:javascript
运行
复制
df = pd.read_csv(file_path, sep='\t')
filter_col = [col for col in list(df) if col.startswith('History')]
df['History'] = 0 # initialize value, otherwise throws KeyError
for c in df[filter_col]:
    df['History'] = df[filter_col].sum(axes=1)
    print df['History', df[filter_col]]

但是,两者都会给出错误:

我的问题要么是:我如何调试这个错误,要么是我的问题有其他解决方案。注意,我有一个相当大的数据帧,大约有400000行和100列,所以我正在寻找一种优化的解决方案,比如使用

在熊猫身上。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-02 20:19:38

我建议您做一些不同的事情,那就是执行转置,按行(原始列)的前缀分组,求和,然后再次转置。

请考虑以下几点:

代码语言:javascript
运行
复制
df = pd.DataFrame({
        'a_a': [1, 2, 3, 4],
        'a_b': [2, 3, 4, 5],
        'b_a': [1, 2, 3, 4],
        'b_b': [2, 3, 4, 5],
    })

现在

代码语言:javascript
运行
复制
[s.split('_')[0] for s in df.T.index.values]

是列的前缀。所以

代码语言:javascript
运行
复制
>>> df.T.groupby([s.split('_')[0] for s in df.T.index.values]).sum().T
    a   b
0   3   3
1   5   5
2   7   7
3   9   9

做你想做的。

对于您的情况,请确保使用

性格。

票数 13
EN

Stack Overflow用户

发布于 2016-03-02 20:45:24

使用brilliant DSM的想法:

代码语言:javascript
运行
复制
from __future__ import print_function

import pandas as pd

categories = set(['Economics', 'English', 'Histo', 'Literature'])

def correct_categories(cols):
    return [cat for col in cols for cat in categories if col.startswith(cat)]    

df = pd.read_csv('data.csv', sep=r'\s+', index_col='Id')

#print(df)
print(df.groupby(correct_categories(df.columns),axis=1).sum())

输出:

代码语言:javascript
运行
复制
Economics  English  Histo  Literature
Id
56          1        1      2           1
11          1        0      0           1
6           1        1      0           0
43          2        0      1           1
14          1        1      1           0

这是另一个版本,它解决了"Histo/History“的问题。

代码语言:javascript
运行
复制
from __future__ import print_function

import pandas as pd

#categories = set(['Economics', 'English', 'Histo', 'Literature'])

#
# mapping: common starting pattern: desired name
#
categories = {
    'Histo': 'History',
    'Economics': 'Economics',
    'English': 'English',
    'Literature': 'Literature'
}

def correct_categories(cols):
    return [categories[cat] for col in cols for cat in categories.keys() if col.startswith(cat)]

df = pd.read_csv('data.csv', sep=r'\s+', index_col='Id')
#print(df.columns, len(df.columns))
#print(correct_categories(df.columns), len(correct_categories(df.columns)))
#print(df.groupby(pd.Index(correct_categories(df.columns)),axis=1).sum())

rslt = df.groupby(correct_categories(df.columns),axis=1).sum()
print(rslt)
print('History\n', rslt['History'])

输出:

代码语言:javascript
运行
复制
Economics  English  History  Literature
Id
56          1        1        2           1
11          1        0        0           1
6           1        1        0           0
43          2        0        1           1
14          1        1        1           0
History
 Id
56    2
11    0
6     0
43    1
14    1
Name: History, dtype: int64

PS您可能想要将缺少的类别添加到

地图/字典

票数 4
EN

Stack Overflow用户

发布于 2021-03-01 21:43:33

您可以使用它们来创建以特定名称开头的列的总和,

代码语言:javascript
运行
复制
df['Economics']= df[list(df.filter(regex='Economics'))].sum(axis=1)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35746847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档