[英]pandas: set row values to letter of the alphabet corresponding to index number?
我有一个数据帧:
a b c country
0 5 7 11 Morocco
1 5 9 9 Nigeria
2 6 2 13 Spain
我想添加一个列e
,它是与索引号对应的字母表中的字母,例如:
a b c country e
0 5 7 11 Morocco A
1 5 9 9 Nigeria B
2 6 2 13 Spain C
我怎样才能做到这一点? 我试过了:
df['e'] = chr(ord('a') + df.index.astype(int))
但我得到:
TypeError: int() argument must be a string or a number, not 'Int64Index'
一种方法是将索引转换为Series
,然后调用apply
并传递lambda
:
In[271]:
df['e'] = df.index.to_series().apply(lambda x: chr(ord('a') + x)).str.upper()
df
Out[271]:
a b c country e
0 5 7 11 Morocco A
1 5 9 9 Nigeria B
2 6 2 13 Spain C
基本上你的错误是df.index
的类型为Int64Index
,而chr
函数不理解如何操作,所以通过在一个Series
上调用apply
我们迭代逐行转换。
我认为在性能方面,列表理解会更快:
In[273]:
df['e'] = [chr(ord('a') + x).upper() for x in df.index]
df
Out[273]:
a b c country e
0 5 7 11 Morocco A
1 5 9 9 Nigeria B
2 6 2 13 Spain C
计时
%timeit df.index.to_series().apply(lambda x: chr(ord('a') + x)).str.upper()
%timeit [chr(ord('a') + x).upper() for x in df.index]
1000 loops, best of 3: 491 µs per loop
100000 loops, best of 3: 19.2 µs per loop
列表理解方法明显更快
这是另一种功能解决方案。 假设你的国家少于字母。
from string import ascii_uppercase
from operator import itemgetter
df['e'] = itemgetter(*df.index)(ascii_uppercase)
print(df)
a b c country e
0 5 7 11 Morocco A
1 5 9 9 Nigeria B
2 6 2 13 Spain C
你也可以使用map
并从df.index
获取值:
df['e'] = map(chr, ord('A') + df.index.values)
如果你做速度比较:
# Edchum
%timeit df.index.to_series().apply(lambda x: chr(ord('A') + x))
10000 loops, best of 3: 135 µs per loop
%timeit [chr(ord('A') + x) for x in df.index]
100000 loops, best of 3: 7.38 µs per loop
# jpp
%timeit itemgetter(*df.index)(ascii_uppercase)
100000 loops, best of 3: 7.23 µs per loop
# Me
%timeit map(chr,ord('A') + df.index.values)
100000 loops, best of 3: 3.12 µs per loop
因此map
似乎更快,但可能是因为数据样本的长度
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.