Python Pandas Dataframe Customize Index



>我有一个简单的数据帧和 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

任何帮助都非常感谢!

用途:DataFrame.add_prefix,

您还需要事先使用 DataFrame.transpose,因为add_prefix方法作用于列。还需要在末尾使用转置将数据帧返回到原始形式

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 行即可。

另一种较短的方法

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
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

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

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 位数字。

想出了一个办法:

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

;)

最新更新