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、zip
和 f-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 groupby分组后的数据怎么用