Объединение значений фрейма данных в новый фрейм данных - PullRequest
0 голосов
/ 01 октября 2018

Я комбинирую два значения данных из файла Excel в новый, но объединенные значения изменились на десятичное число.Вот мои коды:

Мой фрейм данных, который я хочу объединить:

cable_block    pair
1              10
1              11
3              123
3              222

Я вставляю фрейм данных, чтобы объединить эти два с разделителем /, поэтому вот мой код:

df['new_col'] = df[['cable_block', 'pair']].apply(lambda x: '/'.join(x.astype(str), axis=1))

Результат, который я получаю:

cable_block    pair   new_col
1              10     1.0/10.0
1              11     1.0/11.0
3              123    3.0/123.0
3              222    3.0/222.0

После поиска я нашел хороший ответ здесь Psidom и Skirrebattie.Поэтому я попытался:

df['new_col'] = df['new_col'].applymap(str)

и

df['new_col'] = df['new_col'].astype(str)

Но это не работает так, как должно.Смотря по кодам, это должно работать, и я нахожу странным, что это не так.

Есть ли другая работа вокруг?

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Вы можете использовать понимание списка и f-строки:

df['new_col'] = [f'{cable_block}/{pair}' for cable_block, pair in df.values]

print(df)

   cable_block  pair new_col
0            1    10    1/10
1            1    11    1/11
2            3   123   3/123
3            3   222   3/222

Подход сравнительно хорошо сравнивается с альтернативами:

df = pd.concat([df]*10000, ignore_index=True)

%timeit df['cable_block'].astype(str) + '/' + df['pair'].astype(str)  # 62.8 ms
%timeit [f'{cable_block}/{pair}' for cable_block, pair in df.values]  # 85.1 ms
%timeit list(map('/'.join, map(list, df.values.astype(str))))         # 157 ms
%timeit df.astype(str).apply('/'.join,1)                              # 1.11 s
0 голосов
/ 01 октября 2018

Во-первых, чтобы удалить завершающий .0, убедитесь, что данные int:

 df = df.astype(int)

Затем вы можете сделать:

df['cable_block'].astype(str) + '/' + df['pair'].astype(str)

0     1/10
1     1/11
2    3/123
3    3/222
dtype: object

Другой вариант чтобы обеспечить правильное форматирование:

 df.apply(lambda x: "%d/%d" %(x['cable_block'], x['pair']), axis=1)

0     1/10
1     1/11
2    3/123
3    3/222
dtype: object
0 голосов
/ 01 октября 2018
df['cable_block'].astype(int).astype(str) + '/' + df['pair'].astype(int).astype(str)

Данные в вашем фрейме данных, вероятно, плавающие, а не целые.

0 голосов
/ 01 октября 2018

Почему бы не использовать astype

df.astype(str).apply('/'.join,1)
Out[604]: 
0     1/10
1     1/11
2    3/123
3    3/222
dtype: object
...