Pandas - Создать столбец, просмотрев значение столбца в другом столбце - PullRequest
0 голосов
/ 05 мая 2020

У меня есть фрейм данных ниже

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 (x в [1-3]) и выполните поиск в столбце 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 для поиска информации, содержащейся в ID1 в столбец Number (как он мог повторяться, только первый уже помогает) и, таким образом, вывести значение, которое находится в той же строке, но в столбце Name, и так далее, объедините эти значения, чтобы сформировать столбец id_name1.

Я пытался сделать это для l oop и lo c / ilo c, но у меня не получилось. Может ли кто-нибудь дать мне свет?

Изменить: мне нужно получить значение столбца ID1 в столбце Number и вернуть значение столбца Number и значение столбца Name.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Используйте 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
1 голос
/ 05 мая 2020

создать сопоставление числа с числом и буквой:

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
1 голос
/ 05 мая 2020

Вы можете определить некоторые сопоставления и выполнить for-l oop для каждого столбца:

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
...