Как добавить еще один парный столбец в pandas данных? - PullRequest
3 голосов
/ 20 апреля 2020
df = pd.DataFrame({'col1':['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l','b-a', 'd-c', 'f-e', 'h-g', 'j-i', 'l-k']})

У вас есть один столбец с перекрывающейся комбинацией, несмотря на то, что ордер кажется перевернутым Но как добавить еще один столбец на другой стороне, чтобы показать, что они такие же, как показано ниже:

df2 = pd.DataFrame({'col1':['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l','b-a', 'd-c', 'f-e', 'h-g', 'j-i', 'l-k']
,'col2':['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l','a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l']})

Реальные данные не предсказуемы, как последовательность альфа-бета, поэтому у меня разболелась голова.

Заранее спасибо.

Ответы [ 7 ]

3 голосов
/ 20 апреля 2020

map с ord и получим sum каждой строки, за которыми следует groupby()+transform('first'):

f = df['col1'].str.split('-').explode().map(ord).sum(level=0)
df.assign(col2=df.groupby(f).transform('first'))

   col1 col2
0   a-b  a-b
1   c-d  c-d
2   e-f  e-f
3   g-h  g-h
4   i-j  i-j
5   k-l  k-l
6   b-a  a-b
7   d-c  c-d
8   f-e  e-f
9   h-g  g-h
10  j-i  i-j
11  l-k  k-l
2 голосов
/ 20 апреля 2020

IIU C

df.groupby(df.col1.str.split('-').map(lambda x : tuple(sorted(x)))).col1.transform('first')
0     a-b
1     c-d
2     e-f
3     g-h
4     i-j
5     k-l
6     a-b
7     c-d
8     e-f
9     g-h
10    i-j
11    k-l
Name: col1, dtype: object
1 голос
/ 20 апреля 2020

Я бы сделал это следующим образом:

import pandas as pd
df = pd.DataFrame({'col1':['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l','b-a', 'd-c', 'f-e', 'h-g', 'j-i', 'l-k']})
def order(x):
    return x if x[0]<x[-1] else ''.join(x[::-1])
df['col2'] = df['col1'].map(order)
print(df)

Вывод:

   col1 col2
0   a-b  a-b
1   c-d  c-d
2   e-f  e-f
3   g-h  g-h
4   i-j  i-j
5   k-l  k-l
6   b-a  a-b
7   d-c  c-d
8   f-e  e-f
9   h-g  g-h
10  j-i  i-j
11  l-k  k-l

Я создал функцию, которая просто сравнивает первый и последний символ (дает тот же результат, что и сравнение их кодов ASCII) и в зависимости от результата return s, что было кормом или наоборот str. Затем я использую pandas .Series.map , что полезно, когда вам нужно применить функцию (или другое преобразование) к элементам столбца dataframe. Это решение предполагает, что все ваши данные верны, т. Е. Всегда состоит из:

  • одной строчной буквы
  • одной -
  • одной строчной буквы
0 голосов
/ 20 апреля 2020

Это строит решение @ anky, используя ord :

df['flip'] = [ent
              if ord(ent[0]) < ord(ent[-1])
              else ent[-1]+'-'+ent[0]
              for ent in df.col1.array]

   col1 flip
0   a-b a-b
1   c-d c-d
2   e-f e-f
3   g-h g-h
4   i-j i-j
5   k-l k-l
6   b-a a-b
7   d-c c-d
8   f-e e-f
9   h-g g-h
10  j-i i-j
11  l-k k-l
0 голосов
/ 20 апреля 2020
def transformer(value):
   alphabets=value.split('-')
   return value if ord(alphabets[0])<ord(alphabets[1]) else alphabets[1]+'-'+alphabets[0]
df['col2']= df['col1'].transform(transformer)

Объяснение: Используя transform () для df ['col1'], я применяю функцию transformer (), определенную выше, где я разделяю строку и проверяю, меньше ли значение ASCII 1-го алфавита, чем 2-го алфавита & возвращая результат соответственно

0 голосов
/ 20 апреля 2020

IIU C,

df['col2'] = df['col1'].str.split('-'
,expand=True).stack().sort_values().groupby(level=0).agg('-'.join)


print(df)

   col1 col2
0   a-b  a-b
1   c-d  c-d
2   e-f  e-f
3   g-h  g-h
4   i-j  i-j
5   k-l  k-l
6   b-a  a-b
7   d-c  c-d
8   f-e  e-f
9   h-g  g-h
10  j-i  i-j
11  l-k  k-l
0 голосов
/ 20 апреля 2020

Трудно сказать, о чем вы спрашиваете из оригинального поста. Вы спрашиваете о дублировании столбца?

df = pd.DataFrame({'col1':['a-b', 'c-d', 'e-f', 'g-h', 'i-j', 'k-l','b-a', 'd-c', 'f- 
e', 'h-g', 'j-i', 'l-k']})

df['col2'] = df['col1']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...