Заданный фрейм данных df =

ordinal     id          A           B
 1          14318       45.0714     7.6187
 2          14318       45.0739     7.6195
 3          14318       45.0745     7.6152
 4          14318       45.0833     7.6145
 5          14318       45.0946     7.6194

Я хочу объединить столбцы A и B в столбец C уникальными значениями 'id'. Итак, я попробовал следующий код:

df['C'] = list(zip(df.A.astype(float), df.B.astype(float)))

Здесь тип столбца C является объектом. Но мне нужно float или int. Я имею в виду, мне нужно что-то вроде

([[1, 2], [1, 4], [1, 0],  [10, 2], [10, 4], [10, 0]])

Но я получаю:

ordinal id      A           B       C
    1   14318   45.0714     7.6187  (45.0714, 7.6187)
    2   14318   45.0739     7.6195  (45.0739, 7.6195)
    3   14318   45.0745     7.6152  (45.0745, 7.6152)
    4   14318   45.0833     7.6145  (45.0833, 7.6145)

ИЗМЕНЕНО

Пожеланная выходная мощность:

id      C
14318   ([[45.0714, 7.6187], [45.0739, 7.6195], [45.0745, 7.6152],  [45.0833, 7.6145]])
-1
Mamed 19 Авг 2019 в 11:07

2 ответа

Лучший ответ

IIUC необходимо:

df['C'] = list(zip(df.A.astype(int), df.B.astype(int)))

print (df)
   ordinal     id        A       B        C
0        1  14318  45.0714  7.6187  (45, 7)
1        2  14318  45.0739  7.6195  (45, 7)
2        3  14318  45.0745  7.6152  (45, 7)
3        4  14318  45.0833  7.6145  (45, 7)
4        5  14318  45.0946  7.6194  (45, 7)

Если нужны списки:

df['C'] = [list(x) for x in zip(df.A.astype(float), df.B.astype(float))]
#alternative
#df['C'] = list(map(list, zip(df.A.astype(float), df.B.astype(float))))

print (df)
   ordinal     id        A       B                  C
0        1  14318  45.0714  7.6187  [45.0714, 7.6187]
1        2  14318  45.0739  7.6195  [45.0739, 7.6195]
2        3  14318  45.0745  7.6152  [45.0745, 7.6152]
3        4  14318  45.0833  7.6145  [45.0833, 7.6145]
4        5  14318  45.0946  7.6194  [45.0946, 7.6194]
1
jezrael 19 Авг 2019 в 08:13

Вы можете использовать метод apply:

df[['A', 'B']].apply(tuple, axis=1)
0    (45.0714, 7.6187)
1    (45.0739, 7.6195)
2    (45.0745, 7.6152)
3    (45.0833, 7.6145)
4    (45.0946, 7.6194)

Или, чтобы получить кортеж целых:

df[['A', 'B']].apply(lambda x: tuple(map(int, x)), axis=1)

Однако новый тип объекта будет object, а не float или int, поскольку это массив.

0
iDrwish 19 Авг 2019 в 08:18