代码之家  ›  专栏  ›  技术社区  ›  Richard

熊猫:将行值设置为对应于索引号的字母表的字母?

  •  3
  • Richard  · 技术社区  · 7 年前

    我有一个数据框:

       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'
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   EdChum Arthur G    7 年前

    一种方法是将索引转换为 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 函数不理解如何使用它,因此通过调用 应用 在一 系列 我们逐行迭代来转换。

    我认为从表现上看,列表理解会更快:

    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
    

    这里的列表理解方法要快得多

        2
  •  0
  •   jpp    7 年前

    这是另一种功能解决方案。假设你的国家少于字母。

    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
    
        3
  •  0
  •   Ben.T    7 年前

    你可以使用 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
    

    所以 地图 似乎更快,但可能是因为数据样本的长度