在我的代码中,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
Male
和Female
条目的代码
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())
但我还没有完成我的最新任务。有什么想法吗?
答案 0 :(得分:5)
通过GroupBy.cumcount
为unstack
重新创建的新列名称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