繁体   English   中英

pandas:将行值设置为与索引号对应的字母表的字母?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM