在数据分析的熊猫中,我遇到了一个示例,其中我们有一个包含以下列的表:
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
?
答案 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