【问题标题】:Python Pandas Dataframe Customize IndexPython Pandas Dataframe 自定义索引
【发布时间】:2020-01-21 00:53:39
【问题描述】:

我有一个简单的数据框和 2 个字符串变量,如下所示:

index  col1
0         x
1         x
2         x

str1 = 'USD'
str2 = 'pricing'

我想将索引重命名为“str1-str2-###”:

index             col1
USD-pricing-001      x
USD-pricing-002      x
USD-pricing-003      x

非常感谢任何帮助!

【问题讨论】:

    标签: python string pandas dataframe indexing


    【解决方案1】:

    使用:DataFrame.add_prefix

    您还需要事先使用DataFrame.transpose,因为add_prefix 方法作用于列。最后还需要使用转置将dataframe返回到原来的形式

    prefix=str1+'-'+str2+'-00'
    df=df.set_index('index').T.add_prefix(prefix).T
    print(df)
    
                    col1
    index               
    USD-pricing-000    x
    USD-pricing-001    x
    USD-pricing-002    x
    

    要回复@razdi 评论,更通用的解决方案,您可以使用:

    prefix=str1+'-'+str2+'-'
    df['index']=[(3-len(key))*'0'+key for key in df['index'].astype(str)]
    df=df.set_index('index').T.add_prefix(prefix).T
    print(df)
    

    示例

    df=pd.DataFrame()
    df['col1']='x x x x x x x x x x x x x x'.split()
    df.reset_index(inplace=True)
    print(df)
    
        index col1
    0       0    x
    1       1    x
    2       2    x
    3       3    x
    4       4    x
    5       5    x
    6       6    x
    7       7    x
    8       8    x
    9       9    x
    10     10    x
    11     11    x
    12     12    x
    13     13    x
    

    应用显示的代码:

    prefix=str1+'-'+str2+'-'
    df['index']=[(3-len(key))*'0'+key for key in df['index'].astype(str)]
    df=df.set_index('index').T.add_prefix(prefix).T
    print(df)
    
                    col1
    index               
    USD-pricing-000    x
    USD-pricing-001    x
    USD-pricing-002    x
    USD-pricing-003    x
    USD-pricing-004    x
    USD-pricing-005    x
    USD-pricing-006    x
    USD-pricing-007    x
    USD-pricing-008    x
    USD-pricing-009    x
    USD-pricing-010    x
    USD-pricing-011    x
    USD-pricing-012    x
    USD-pricing-013    x
    

    当然,只要您的数据框少于 1000 行。

    【讨论】:

    • 我看到的唯一问题是零的数量固定为两个。该问题提到###,表示总共只需要三位数字。所以位数需要根据索引改变
    【解决方案2】:

    这里有另一种更短的方式

    df = df.rename(lambda x: f'{str1}-{str2}-{x:003}')
    
    Out[757]:
                    col1
    index
    USD-pricing-000    x
    USD-pricing-001    x
    USD-pricing-002    x
    

    尝试使用 listcomp、zipf-string 创建连接字符串的列表。最后赋值给df.index

    arr = [f'{t[0]}-{t[1]}-{t[2]:03}' for t in 
                   zip([str1] * df.index.size, [str2] * df.index.size, df.index)]
    
    In [744]: arr
    Out[744]: ['USD-pricing-000', 'USD-pricing-001', 'USD-pricing-002']
    
    df.index = arr
    
    Out[747]:
                    col1
    USD-pricing-000    x
    USD-pricing-001    x
    USD-pricing-002    x
    

    【讨论】:

      【解决方案3】:
      df = pd.DataFrame(\
          {'col1': ['x' ,'x' ,'x' ,'x' ,'x'],\
          },)
      
      loops = len(df) + 1 
      list_index = []
      
      for x in range(1,loops):
          list_index.append("USD-pricing-00"+str(x))
      
      df.index = list_index
      

      【讨论】:

        【解决方案4】:

        这是一个易于理解的单行解决方案:

        df = pd.DataFrame({'col':['a',0]})
        
        df.index = df.index.to_series().apply(lambda x: str(1) + '-' + str(2) + '-' + str(x).zfill(3))
        
        

        输出:

        >>> df
                          col
        USD-pricing-000   a
        USD-pricing-001   0
        

        使用zfill 可以避免使用00100 之类的数字进行索引的问题。因为你提到了'str1-str2-###' 的格式,我假设这个数字需要是 3 位数。使用之前的一些格式,00 将被固定,并导致 4 位数字具有更大的索引值。

        【讨论】:

          【解决方案5】:

          想出了一个办法:

          df['temp'] = str1 + '-' str2 + '-' + (df.index + 1).astype('str').str.zfill(3)
          df.set_index('temp', inplace = True)
          

          ;)

          【讨论】:

          • 很高兴您想通了,但请接受其中一个答案。谢谢
          猜你喜欢
          • 2018-08-13
          • 2017-01-03
          • 2012-05-14
          • 2013-09-08
          • 2018-12-20
          • 1970-01-01
          • 2019-04-13
          • 2018-05-13
          • 2018-07-08
          相关资源
          最近更新 更多