我有一个如下所示的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
答案 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
islice
和cycle
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