python столбцы слияния данных в соответствии с другими значениями столбцов - PullRequest
0 голосов
/ 18 февраля 2020

То, что я хочу сделать, это объединить столбцы в соответствии со значениями в другом столбце. Это лучше проиллюстрировать на простом примере: у меня есть кадр данных с 5 столбцами:

| player_num    | team_1.x  | team_1.y  | team_2.x  | team_2.y  |
|------------   |---------- |---------- |---------- |---------- |
| 1             | x_1       | y_1       | x_2       | y_2       |
| 4             | x_3       | y_3       | x_4       | y_4       |
| 8             | x_5       | y_5       | x_6       | y_6       |

Я хочу получить следующую таблицу :

| x     | y     |
|-----  |-----  |
| x_1   | y_1   |
| x_3   | y_3   |
| x_6   | y_6   |

, где столбцы заполнены значениями из team_1.x и team_1.y для рядов игроков с номером менее 5 и значениями из team_2.x и team_2.y для рядов игроков с номером больше 5

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Вы можете использовать Numpy np.where для этого:

import numpy as np
...
df['x'] = np.where(df['player_num'] < 5, df['team_1.x'], df['team_2.x'])
df['y'] = np.where(df['player_num'] < 5, df['team_1.y'], df['team_2.y'])

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

# Extract column names and remove prefix to get a list of x,y,z, etc.
cols = [col.split('.')[1] for col in list(df) if 'team_' in col]

# Loop over and create new column for each prefix (x, y, z, etc)
for col in cols:
    col1 = 'team_1.' + col
    col2 = 'team_2.' + col
    df[col] = np.where(df['player_num']<5, df[col1], df[col2])
1 голос
/ 18 февраля 2020

Вы можете разделить фрейм данных на основе условий, сопровождаемых конкатенацией результатов

l = df.loc[df["player_num"].lt(5), ["team_1.x", "team_1.y"]].rename(columns={"team_1.x": "x", "team_1.y": "y"})
g = df.loc[df["player_num"].gt(5), ["team_2.x", "team_2.y"]].rename(columns={"team_2.x": "x", "team_2.y": "y"})
df_res = pd.concat([l, g])
print(df_res)
0 голосов
/ 18 февраля 2020

Это совсем не элегантное решение, но оно должно работать ...

for i in df.loc[:, 'player_num']:
    index = df.loc[df.loc[:, 'player_num'] == i].index[0]

    if i >= 5:
        df.loc[index, 'x'] = df.loc[index, 'team_2.x']
        df.loc[index, 'y'] = df.loc[index, 'team_2.y']

    else:
        df.loc[index, 'x'] = df.loc[index, 'team_1.x']
        df.loc[index, 'y'] = df.loc[index, 'team_1.x']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...