Pandas - 通过在另一列中查找一列的值来创建一列
Pandas - Create a column by looking up the value of a column in another column
我有下面的数据框
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)并在数字列中搜索 return 第一个值并与列值 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 中包含的信息(因为它可能会重复,只有第一个已经有帮助),因此,带上在同一行但在 Name 列中的值等等将这些值连接起来形成列 id_name1.
我尝试为循环和 loc / iloc 做,但我做不到 it.Can 谁能给我点灯?
编辑:我需要获取 Number 列中 ID1 列的值以及 return Number 列的值和 Name 列的值。
您可以定义一些映射并为每一列做一个 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
使用 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
创建数字到数字和字母的映射:
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
我有下面的数据框
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)并在数字列中搜索 return 第一个值并与列值 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 中包含的信息(因为它可能会重复,只有第一个已经有帮助),因此,带上在同一行但在 Name 列中的值等等将这些值连接起来形成列 id_name1.
我尝试为循环和 loc / iloc 做,但我做不到 it.Can 谁能给我点灯?
编辑:我需要获取 Number 列中 ID1 列的值以及 return Number 列的值和 Name 列的值。
您可以定义一些映射并为每一列做一个 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
使用 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
创建数字到数字和字母的映射:
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