在pandas dataframe中以相同字符串开头的列的值的总和

Ama*_*nda 6 python startswith dataframe pandas

我有一个大约100列的数据框,看起来像

   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  
Run Code Online (Sandbox Code Playgroud)

所以我的目标是只留下更多的全球类别:只有英语,历史,文学,并在这些数据帧中写出其组成部分的总和,例如英语:英语-107,英语-2

    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          
Run Code Online (Sandbox Code Playgroud)

所以对于那些提议我是真的这两个方法

      first method:

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)]
Run Code Online (Sandbox Code Playgroud)

第二种方法:

    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]]
Run Code Online (Sandbox Code Playgroud)

,但都给我错误

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed

您能否建议我如何调试此错误,或者为我的问题解决另一个问题.请注意,我有一个包含大约100列和400000行的大型数据框,所以我正在寻找像loc熊猫一样的优化解决方案

小智 13

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

df['Economics']= df[list(df.filter(regex='Economics'))].sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更加优雅的解决方案。感谢您对这篇 5 年前的帖子的贡献 (2认同)

Ami*_*ory 7

我建议你做一些不同的事情,即执行转置,分组行(你的原始列)的前缀,总和,再转置.

考虑以下:

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],
    })
Run Code Online (Sandbox Code Playgroud)

现在

[s.split('_')[0] for s in df.T.index.values]
Run Code Online (Sandbox Code Playgroud)

是列的前缀.所以

>>> 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
Run Code Online (Sandbox Code Playgroud)

做你想要的.

在您的情况下,请确保使用该'-'字符进行拆分.

  • `groupby`接受一个轴= 1个参数,所以像`df.groupby(df.columns.str.split( " - ").str的[0],轴= 1)的.sum()`可能工作.(那个`Histo`专栏让我想知道我们是否必须使用不同的分组条件,但你明白了.) (3认同)