Панды сопоставляют один столбец с комбинацией двух столбцов - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю с DataFrame, который выглядит следующим образом

List    Numb    Name
1       1       one
1       2       two
2       3       three
4       4       four
3       5       five

, и я пытаюсь вычислить следующий вывод.

List    Numb    Name
one     1       one
one     2       two
two     3       three
four    4       four
three   5       five

В моем текущем подходе япытаясь перебрать столбцы, затем замените значения содержимым третьего столбца.

Например, если List[0][1] равно Numb[1][1], заменить столбец List[0][1] на 'one'.

Как я могу сделать итерацию, подобную этой работе, или, альтернативно, решить проблему без явной итерации вообще?

Ответы [ 6 ]

0 голосов
/ 19 декабря 2018

Аналогично ответу Вайшали ответу, но создание Series явно выглядит немного быстрее.

df['List'] = df['List'].map(pd.Series(df['Name'].values, df['Numb']))

Времена (столбцы Numb и Name имеют пустышку с уникальным значениемданные, и я только включил три самых быстрых решения до сих пор):

>>> df                                                                                                                 
      List  Numb        Name
0        1     1       one_0
1        1     2       two_1
2        2     3     three_2
3        4     4      four_3
4        3     5      five_4
...    ...   ...         ...
4995     1  4996    one_4995
4996     1  4997    two_4996
4997     2  4998  three_4997
4998     4  4999   four_4998
4999     3  5000   five_4999

[5000 rows x 3 columns]

# Timings (i5-6200U CPU @ 2.30GHz, but only relative times are interesting)
>>> %timeit df.set_index('Numb')['Name'].reindex(df['List']).values # jpp                                              
1.14 ms ± 3.36 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df['List'].map(df.set_index('Numb')['Name']) # Vaishali                                                    
1.04 ms ± 7.13 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df['List'].map(pd.Series(df['Name'].values, df['Numb'])) # timgeb                                                   
437 µs ± 3.16 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0 голосов
/ 19 декабря 2018

Используя set_index, а затем reindex:

df['List'] = df.set_index('Numb')['Name'].reindex(df['List']).values

print(df)

    List  Numb   Name
0    one     1    one
1    one     2    two
2    two     3  three
3   four     4   four
4  three     5   five
0 голосов
/ 19 декабря 2018

Вы можете сделать это в одну строку.Похоже, вы хотите присоединить свой фрейм данных к себе:

df.rename(columns={"List": "List_numb"}).join(df.set_index("Numb")["Name"].to_frame("List"), on="List_numb")[["List", "Numb", "Name"]]
0 голосов
/ 19 декабря 2018

Использовать карту

df['List'] = df['List'].map(df.set_index('Numb')['Name'])


    List    Numb    Name
0   one     1   one
1   one     2   two
2   two     3   three
3   four    4   four
4   three   5   five
0 голосов
/ 19 декабря 2018

Как насчет создания диктовки, чтобы помочь вам?

import pandas as pd

df = pd.DataFrame({'List': [1, 1, 2, 4, 3], 'Numb': [1, 2, 3, 4, 5], 'Name': ['one', 'two', 'three', 'four', 'five']})

d = dict(zip(df['Numb'], df['Name']))
df = df.replace({'List': d})
0 голосов
/ 19 декабря 2018
import pandas as pd

df = pd.DataFrame({
        'List': [1,1,2,4,3],
        'Numb': [1,2,3,4,5],
        'Name':['one','two','three','four','five']
        })

dfnew = pd.merge(df, df, how='inner', left_on=['List'], right_on=['Numb'])
dfnew = dfnew.rename({'List_x': 'List', 'Numb_x': 'Numb', 'Name_y': 'Name'}, axis='columns')
dfnew = dfnew[['List','Numb','Name']]
dfnew['List'] = dfnew['Name']

print (dfnew)
#    List  Numb   Name
#0    one     1    one
#1    one     2    one
#2    two     3    two
#3   four     4   four
#4  three     5  three
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...