Использование .to_ numpy () для копирования указанных c столбцов из одной строки Pandas Dataframe в другую - PullRequest
1 голос
/ 20 марта 2020

У меня есть датафрейм, подобный этому:

     UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
0  413-20012    3     123      12          1113
1  413-45365    1     889      75          6748
2  413-21165    8     554      13          4536
3  413-24354    1     387      35          7649
4  413-34658    2     121      88          2468
5  413-36889    4     105      76          3336
6  413-23457    5     355      42          7894
7  413-30089    5     146      10          9112
8  413-41158    5     453      91          4545
9  413-51015    9     654      66          2232

И у меня есть словарь родительских: дочерних сопоставлений для уникальных идентификаторов:

parent_child_dict = {
    '413-51015': '413-41158',
    '413-21165': '413-23457',
    '413-45365': '413-41158',
    '413-20012': '413-23457'
}

Что мне нужно сделать, это l oop через Dataframe и замените значения WEIGHT, VOLUME и PRODUCTIVITY «дочернего» строки UniqueID на значения из «родительского» строки UniqueID, где результирующий Dataframe будет выглядеть следующим образом:

     UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
0  413-20012    3     355      42          7894
1  413-45365    1     453      91          4545
2  413-21165    8     355      42          7894
3  413-24354    1     387      35          7649
4  413-34658    2     121      88          2468
5  413-36889    4     105      76          3336
6  413-23457    5     355      42          7894
7  413-30089    5     146      10          9112
8  413-41158    5     453      91          4545
9  413-51015    9     453      91          4545

Я экспериментировал с несколькими возможными решениями, и проблема, с которой я столкнулся, заключается в том, чтобы ограничить копирование таким образом, чтобы значения UniqueID и CST строки 'child' были сохранены, но другие значения были скопированы.

Самое близкое, что я получил, это al oop через словарь, где каждая пара соединяется с этим:

df.loc[df['UniqueID'] == '413-51015'] = df.loc[df['UniqueID'] == '413-41158'].to_numpy()

Это, кажется, приятно заменяет все значения из одной строки в другую.

Любая помощь по исключениям или лучшее решение в целом было бы чрезвычайно полезно. Спасибо.


РЕДАКТИРОВАТЬ

Я зациклил первое решение на столбцы, которые я хочу изменить в наборе данных следующим образом:

columns = []
for col in df.columns:
    columns.append(col)
remove_perm = columns.remove('UniqueID')
remove_perm = columns.remove('CST')
print(columns)

OUTPUT

['WEIGHT', 'VOLUME', 'PRODUCTIVITY']

Затем

for col in columns:
    s = df[['UniqueID', col]].set_index('UniqueID')
    df[col] = s.loc[df['UniqueID'].replace(parent_child_dict)].to_numpy()

Это привело к желаемому набору данных.

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

replace и loc доступ:

s = df[['UniqueID','PRODUCTIVITY']].set_index('UniqueID')

# using to_numpy here :-)
df['PRODUCTIVITY'] = s.loc[df['UniqueID'].replace(parent_child_dict)].to_numpy()

Выход:

    UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
0  413-20012    3     123      12          7894
1  413-45365    1     889      75          4545
2  413-21165    8     554      13          7894
3  413-24354    1     387      35          7649
4  413-34658    2     121      88          2468
5  413-36889    4     105      76          3336
6  413-23457    5     355      42          7894
7  413-30089    5     146      10          9112
8  413-41158    5     453      91          4545
9  413-51015    9     654      66          4545
0 голосов
/ 20 марта 2020

Сначала создайте отображение из ваших UniqueID и PRODUCTIVITY.

Затем используйте родительский ребенок для сопоставления ваших идентификаторов:

mapping = df.set_index('UniqueID')['PRODUCTIVITY'].to_dict()
df['PRODUCTIVITY'] = (
    df['UniqueID'].map(parent_child_dict).map(mapping).fillna(df['PRODUCTIVITY']).astype(int)
)
print(df)
    UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
0  413-20012    3     123      12          7894
1  413-45365    1     889      75          4545
2  413-21165    8     554      13          7894
3  413-24354    1     387      35          7649
4  413-34658    2     121      88          2468
5  413-36889    4     105      76          3336
6  413-23457    5     355      42          7894
7  413-30089    5     146      10          9112
8  413-41158    5     453      91          4545
9  413-51015    9     654      66          4545
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...