Создайте столбец в pandas кадре данных - PullRequest
0 голосов
/ 09 июля 2020

У меня есть фрейм данных, как показано ниже:

df = pd.DataFrame({'ORDER':["A", "A", "A", "B", "B","B"], 'GROUP': ["A1C", "A1", "B1", "B1C", "M1", "M1C"]})
df['_A1_XYZ'] = 1
df['_A1C_XYZ'] = 2
df['_B1_XYZ'] = 3
df['_B1C_XYZ'] = 4
df['_M1_XYZ'] = 5
df

    ORDER   GROUP   _A1_XYZ   _A1C_XYZ   _B1_XYZ      _B1C_XYZ  _M1_XYZ
0   A       A1C      1          2             3       4          5     
1   A       A1       1          2             3       4          5     
2   A       B1       1          2             3       4          5     
3   B       B1C      1          2             3       4          5     
4   B       M1       1          2             3       4          5     
5   B       M1C      1          2             3       4          5     

Я хочу создать столбец «NEW» на основе столбца «GROUP» и всех столбцов, которые заканчиваются на XYZ, как показано ниже: На основе значение GROUP для каждой строки df ["NEW"] = df [" _XYZ"].

Например, для 1-й строки GROUP = A1 C, поэтому "NEW" = 2 (_A1C_XYZ), аналогично для 2-й строки "NEW" = 1 (_A1_XYZ)

Мой ожидаемый результат

    ORDER   GROUP   _A1_XYZ   _A1C_XYZ   _B1_XYZ      _B1C_XYZ  _M1_XYZ      NEW
0   A       A1C      1          2             3       4          5           2
1   A       A1       1          2             3       4          5           1
2   A       B1       1          2             3       4          5           3
3   B       B1C      1          2             3       4          5           4
4   B       M1       1          2             3       4          5           5
5   B       M1C      1          2             3       4          5           

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Используйте pd.DataFrame.lookup:

df['NEW'] = df.lookup(df.index, '_'+df['GROUP']+'_XYZ')
df

Вывод:

  ORDER GROUP  _A1_XYZ  _A1C_XYZ  _B1_XYZ  _B1C_XYZ  _M1_XYZ  _M1C_XYZ  NEW
0     A   A1C        1         2        3         4        5         6    2
1     A    A1        1         2        3         4        5         6    1
2     A    B1        1         2        3         4        5         6    3
3     B   B1C        1         2        3         4        5         6    4
4     B    M1        1         2        3         4        5         6    5
5     B   M1C        1         2        3         4        5         6    6

Обновлено после редактирования вопроса.

Или используйте стек и переиндекс,

(df['New'] = df.stack().reindex(zip(df.index, '_'+dfl['GROUP']+'_XYZ'))
               .rename('NEW').reset_index(level=1, drop=True))

df

Вывод:

  ORDER GROUP  _A1_XYZ  _A1C_XYZ  _B1_XYZ  _B1C_XYZ  _M1_XYZ  New
0     A   A1C        1         2        3         4        5    2
1     A    A1        1         2        3         4        5    1
2     A    B1        1         2        3         4        5    3
3     B   B1C        1         2        3         4        5    4
4     B    M1        1         2        3         4        5    5
5     B   M1C        1         2        3         4        5  NaN
0 голосов
/ 09 июля 2020

Ответ @ ScottBoston будет лучше, если все значения в строках также будут столбцами, но я подумал, что поделюсь своим! По сути, я создаю новый фрейм данных с соответствующими столбцами, удаляю дубликаты, меняю имена столбцов, транспонирую фрейм данных и объединяю столбец обратно в ...

a = df.iloc[:,2:].drop_duplicates()
a.columns = [col.split('_')[1] for col in df.columns if '_' in col]
a = a.T.rename({0:'NEW'}, axis=1)
df = pd.merge(df, a, how='left', left_on='GROUP', right_index=True)
df

вывод:

ORDER   GROUP   _A1_XYZ _A1C_XYZ    _B1_XYZ _B1C_XYZ    _M1_XYZ  NEW
0   A   A1C     1       2           3       4           5        2.0
1   A   A1      1       2           3       4           5        1.0
2   A   B1      1       2           3       4           5        3.0
3   B   B1C     1       2           3       4           5        4.0
4   B   M1      1       2           3       4           5        5.0
5   B   M1C     1       2           3       4           5        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...