0

我有下面的数据框

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 列中搜索,然后从那里返回第一个值并与列值名称。

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。

我试图为 loop 和 loc / iloc 做,但我做不到。谁能给我点灯?

编辑:我需要在 Number 列中获取 ID1 列的值,并返回 Number 列的值和 Name 列的值。

4

3 回答 3

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
于 2020-05-05T13:29:10.677 回答
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
于 2020-05-05T13:44:05.940 回答
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
于 2020-05-05T13:25:38.163 回答