pivot_table,其索引不是表

时间:2017-10-13 05:17:18

标签: pandas

数据分析的熊猫中,我遇到了一个示例,其中我们有一个包含以下列的表:

name(string) sex(string) year(int) birth(int)

作者想要汇总年份,性别和名字的最后一个字母,以便他这样做:

# extract last letter from name column
get_last_letter = lambda x: x[-1]
last_letters = names.name.map(get_last_letter)

last_letters.name = 'last_letter'
table = names.pivot_table(values='births', index=last_letters,
columns=['sex', 'year'], aggfunc=np.sum)

last_letters不是表中的列时,我不太明白如何创建pivot_table。 有人可以说明Pandas在聚合时如何正确地将names映射到这些last_letters

1 个答案:

答案 0 :(得分:3)

DataFrame中的列为Series,因此可以使用Series作为pivot_table中的参数。

因此可以使用自定义函数预处理列name仅返回最后一个字母,因为它返回Series什么是完美有效的输入。

样品:

names = pd.DataFrame({
    'name': ['John','John','John','Josh','Josh','Josh','Sara','Sara','Sara'],
    'births': [10,20,10,40,70,10,20,30,50],
    'year': [1980,1985,1980,1985,1985,1985,1985,1980,1980],
    'sex': ['m','m','m','m','m','m','f','f','f']
})
print (names)
   births  name sex  year
0      10  John   m  1980
1      20  John   m  1985
2      10  John   m  1980
3      40  Josh   m  1985
4      70  Josh   m  1985
5      10  Josh   m  1985
6      20  Sara   f  1985
7      30  Sara   f  1980
8      50  Sara   f  1980
# extract last letter from name column
get_last_letter = lambda x: x[-1]
last_letters = names.name.map(get_last_letter)
last_letters.name = 'last_letter'

print (last_letters)
0    n
1    n
2    n
3    h
4    h
5    h
6    a
7    a
8    a
Name: last_letter, dtype: object

print (type(last_letters))
<class 'pandas.core.series.Series'>
table = names.pivot_table(values='births', index=last_letters,
                          columns=['sex', 'year'], aggfunc=np.sum)

print (table)
sex             f           m       
year         1980  1985  1980   1985
last_letter                         
a            80.0  20.0   NaN    NaN
h             NaN   NaN   NaN  120.0
n             NaN   NaN  20.0   20.0