如何使用相同的键对行进行求和?

时间:2018-06-08 09:51:54

标签: python pandas sorting dataframe

在我的代码中,df定义如下

df = pd.read_excel(io=file_name, sheet_name=sheet, sep='\s*,\s*')

我有一个[86 rows x 1 columns]数据框df,在print(df)

上看起来像这样
          0
Male    511
Female  461
Male    273
Female  217
Male    394
Female  337
Female  337
Male    337
...

我希望编写一个merge MaleFemale条目的代码

          0   1   2   3 ...
Male    511 273 394 337 ...
Female  461 217 337 337 ...

我需要做的最后一项任务是.sum()男性行,然后是女性行,以获得每个性别的总数。我是蟒蛇和大熊猫的新手,到目前为止我还没有取得多大进展。任何帮助,教程,文档都会很棒!谢谢!

编辑:按keys我指的是索引。我希望这些男性和女性的标签可以用于俱乐部'这些行在一起,但我不知道如何。

编辑:我已经通过

直接完成了我的上一个任务
print(df.ix['Female'].sum())
print(df.ix['Male'].sum())

但我还没有完成我的最新任务。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

通过GroupBy.cumcountunstack重新创建的新列名称MultiIndex创建df.index = [df.index, df.groupby(level=0).cumcount()] print (df) 0 Male 0 511 Female 0 461 Male 1 273 Female 1 217 Male 2 394 Female 2 337 3 337 Male 3 337

df = df[0].unstack()
print (df)
          0    1    2    3
Female  461  217  337  337
Male    511  273  394  337
sum

然后axis=1所有行print (df.sum(axis=1)) Female 1352 Male 1515 dtype: int64

.travis.yml

答案 1 :(得分:1)

您可以使用concat + transpose

cats = ['Male', 'Female']

res = pd.concat([pd.DataFrame(group.values) for _, group in df.groupby(level=0)],
                axis=1, ignore_index=True)\
        .rename(columns=dict(enumerate(cats)))\
        .transpose()

print(res)

          0    1    2    3
Male    511  273  394  337
Female  461  217  337  337

效果基准

concat + transpose的效果似乎比cumcount + unstack好4倍。通常情况并非如此,但在我们拥有少量大型团体的情况下也是如此,例如此处。

def jpp(df):
    cats = ['Male', 'Female']
    res = pd.concat([pd.DataFrame(group.values) for _, group in df.groupby(level=0)],
                    axis=1, ignore_index=True)\
            .rename(columns=dict(enumerate(cats)))\
            .transpose()
    return res

def jez(df):    
    df.index = [df.index, df.groupby(level=0).cumcount()]
    df = df[0].unstack()
    return df

df2 = pd.concat([df]*10000)

%timeit jpp(df2.copy())  # 12 ms
%timeit jez(df2.copy())  # 52.7ms