我下面有数据框
Number Name ID1 ID2 ID3
100000 a1 100000 100000 100000
200000 a2 200000 200000 200000
101000 a3 100000 101000 101000
201545 a4 200000 201500 201545
101010 a5 100000 101000 101010
201500 a6 200000 201500 201500
我想创建3个新列,对于每个列,我需要获取IDX列的值([1-3]中的x)并在Number列中搜索,然后从中返回第一个值,并与列值Name连接。
Number Name ID1 ID2 ID3 id_name1 id_name2 id_name3
100000 a1 100000 100000 100000 100000-a1 100000-a1 100000-a1
200000 a2 200000 200000 200000 200000-a2 200000-a2 200000-a2
101000 a3 100000 101000 101000 100000-a1 101000-a3 101000-a3
201545 a4 200000 201500 201545 200000-a2 201500-a6 201545-a4
101010 a5 100000 101000 101010 100000-a1 101000-a3 101010-a5
201500 a6 200000 201500 201500 200000-a2 201500-a6 201500-a6
也就是说,对于ID1,我需要创建一个id_name1列,以在Number列中查找ID1中包含的信息(可能已经重复了,只有第一个已经有用),因此,将ID同一行,但在名称列中,依此类推将这些值连接起来以形成列id_name1。
我试图为loop和loc / iloc做它,但是我做不到。有人可以给我个灯吗?
编辑:我需要获取Number列中ID1列的值,并返回Number列和Name列的值。
答案 0 :(得分:1)
您可以定义一些映射并为每个列做一个for循环:
columns = ['ID1', 'ID2', 'ID3']
mappings = dict(zip(df.Number.values, df.Name.values))
for col in columns:
df['id_name' + col[2]] = df[col].astype(str) + '-' + df[col].map(mappings)
df
# Name ID1 ID2 ID3 id_name1 id_name2 id_name3
# Number
# 100000 a1 100000 100000 100000 100000-a1 100000-a1 100000-a1
# 200000 a2 200000 200000 200000 200000-a2 200000-a2 200000-a2
# 101000 a3 100000 101000 101000 100000-a1 101000-a3 101000-a3
# 201545 a4 200000 201500 201545 200000-a2 201500-a6 201545-a4
# 101010 a5 100000 101000 101010 100000-a1 101000-a3 101010-a5
# 201500 a6 200000 201500 201500 200000-a2 201500-a6 201500-a6
答案 1 :(得分:1)
使用map
映射您的值,然后concat
将其返回:
df = pd.read_clipboard(sep="\s\s+").astype(str)
s = df.set_index("Number")["Name"]
df2 = (df.filter(like="ID")+"-"+df.filter(like="ID").apply(lambda x: x.map(s)))
df2.columns = [f"id_name{i}" for i in range(1,4)]
print (pd.concat([df, df2],axis=1))
Number Name ID1 ID2 ID3 id_name1 id_name2 id_name3
0 100000 a1 100000 100000 100000 100000-a1 100000-a1 100000-a1
1 200000 a2 200000 200000 200000 200000-a2 200000-a2 200000-a2
2 101000 a3 100000 101000 101000 100000-a1 101000-a3 101000-a3
3 201545 a4 200000 201500 201545 200000-a2 201500-a6 201545-a4
4 101010 a5 100000 101000 101010 100000-a1 101000-a3 101010-a5
5 201500 a6 200000 201500 201500 200000-a2 201500-a6 201500-a6
答案 2 :(得分:1)
创建数字到数字和字母的映射:
temp = df.Number.astype(str) + '-' + df.Name
mapping = dict(zip(df.Number,temp))
mapping
{100000: '100000-a1',
200000: '200000-a2',
101000: '101000-a3',
201545: '201545-a4',
101010: '101010-a5',
201500: '201500-a6'}
df = df.set_index(['Number','Name'])
#replace values in df with the mapping
#and give it new column names
res = (df
.replace(mapping)
.set_axis(['id_name1','id_name2','id_name3'],axis=1)
)
res
id_name1 id_name2 id_name3
Number Name
100000 a1 100000-a1 100000-a1 100000-a1
200000 a2 200000-a2 200000-a2 200000-a2
101000 a3 100000-a1 101000-a3 101000-a3
201545 a4 200000-a2 201500-a6 201545-a4
101010 a5 100000-a1 101000-a3 101010-a5
201500 a6 200000-a2 201500-a6 201500-a6
与原始数据框合并:
df.join(res)
ID1 ID2 ID3 id_name1 id_nam2 id_name3
Number Name
100000 a1 100000 100000 100000 100000-a1 100000-a1 100000-a1
200000 a2 200000 200000 200000 200000-a2 200000-a2 200000-a2
101000 a3 100000 101000 101000 100000-a1 101000-a3 101000-a3
201545 a4 200000 201500 201545 200000-a2 201500-a6 201545-a4
101010 a5 100000 101000 101010 100000-a1 101000-a3 101010-a5
201500 a6 200000 201500 201500 200000-a2 201500-a6 201500-a6