如何重命名列表中的列中的值?

时间:2019-02-27 16:02:39

标签: python-3.x pandas

我有一个如下所示的df:

col1       col2
value      test1
value      test2
value      test3
value      test4
value      test5

我想像这样重复地从列表中重命名col1:

lst = ['new1','new2','new3','new4','new5']

col1       col2
new1      test1
new2      test2
new3      test3
new4      test4
new5      test5

我需要对col1中的所有行重复该列表。

我尝试过:

df = df.set_index('col1')
df = df.rename(index={'value':['new1','new2','new3','new4','new5']})

但是这会将整个列表传递到col1的每一行,就像这样:

col1                                      col2
['new1','new2','new3','new4','new5']      test1
['new1','new2','new3','new4','new5']      test2
['new1','new2','new3','new4','new5']      test3
['new1','new2','new3','new4','new5']      test4
['new1','new2','new3','new4','new5']      test5

2 个答案:

答案 0 :(得分:4)

assign

这仅适用于OP的示例,其中lst的长度与数据帧df相同

df.assign(col1=lst)

   col1   col2
0  new1  test1
1  new2  test2
2  new3  test3
3  new4  test4
4  new5  test5

更笼统

这是更通用的。如果您不使用Python 3.6并且使用f字符串,则可以使用str.format

df.assign(col1=[f'new{i+1}' for i in range(len(df))])
# df.assign(col1=[*map('new{}'.format, range(1, len(df) + 1))])

   col1   col2
0  new1  test1
1  new2  test2
2  new3  test3
3  new4  test4
4  new5  test5

使用itertools

如果您只想重复列出的清单,则可以使用itertools islicecycle

from itertools import cycle, islice

df.assign(col1=[*islice(cycle(lst), len(df))])

   col1   col2
0  new1  test1
1  new2  test2
2  new3  test3
3  new4  test4
4  new5  test5

答案 1 :(得分:1)

numpy.put

的一种方式
lst = ['new1','new2']
np.put(df['col1'],np.arange(len(df)),lst)
df
Out[37]: 
   col1   col2
0  new1  test1
1  new2  test2
2  new1  test3
3  new2  test4
4  new1  test5

另一个选择

n=len(df)
df['col1']=(lst*((n//len(lst))+1))[:n]
df
Out[48]: 
   col1   col2
0  new1  test1
1  new2  test2
2  new1  test3
3  new2  test4
4  new1  test5