Python Pandas Dataframe 自定义索引

Posted

技术标签:

【中文标题】Python Pandas Dataframe 自定义索引【英文标题】:Python Pandas Dataframe Customize Index 【发布时间】: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

非常感谢任何帮助!

【问题讨论】:

【参考方案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)

;)

【讨论】:

很高兴您想通了,但请接受其中一个答案。谢谢

以上是关于Python Pandas Dataframe 自定义索引的主要内容,如果未能解决你的问题,请参考以下文章

Python库-pandas详解

python中Pandas之DataFrame索引选取数据

Python机器学习入门——科学计算库(Pandas)

python pandas groupby分组后的数据怎么用

在PyODPS DataFrame自定义函数中使用pandasscipy和scikit-learn

python pandas dataframe 写入hdfs