Как поменять элементы в другом списке и разном размере Pandas? - PullRequest
0 голосов
/ 07 января 2020

У меня есть датафрейм df1. Фрейм данных имеет один столбец с именем «Путь». У каждой строки есть список. Они выглядят так:

Path                   
____________________
[OAK, PHX, MIA, FLL, PBG]   
[OAK, SEA, FLL, PBG]   
[OAK, LAS, ORD, FLL, PBG]   
[OAK, DFW, FLL, PBG]
...

I wi sh, чтобы поменять second и третью значение каждой нечетной строки на соответствующую second и третьи значения следующего ряда (четного ряда), а затем поменяйте местами каждую пару по отдельности. В приведенном выше примере ввода значения PHX, MIA из первой строки должны быть заменены значениями SEA, FLL из второй строки, а затем инвертированы.

Path                   
____________________
[OAK, PHX, MIA, FLL, PBG]   
[OAK, SEA, FLL, PBG]   

# Swap 2nd and 3rd value between rows 

Path                   
____________________
[OAK, SEA, FLL, FLL, PBG]   
[OAK, PHX, MIA, PBG]

# Swap 2nd and 3rd value in all rows
Path                   
____________________
[OAK, FLL, SEA, FLL, PBG]   
[OAK, MIA, PHX, PBG]

Результат должен выглядеть примерно так :

Path                   
____________________
[OAK, FLL, SEA, FLL, PBG]   
[OAK, MIA, PHX, PBG]   
[OAK, FLL, DFW, FLL, PBG]   
[OAK, ORD, LAS, PBG]
.... 

Как мне сделать это с Python?

1 Ответ

0 голосов
/ 07 января 2020
out = df['Path'].apply(lambda x : pd.Series(x)  )

dfLength = len(df)
if dfLength%2==0:
    oddIndex = list(range(0,dfLength-1, 2))
    evenIndex = list(range(1, dfLength,2))
else:
    oddIndex = list(range(0,dfLength, 2))
    evenIndex = list(range(1, dfLength,2))

#Swapping odd-even rows
oddData = out.iloc[oddIndex][[1,2]].copy() 
evenData = out.iloc[evenIndex][[1,2]].copy()

out.iloc[oddIndex, [1,2]] = evenData.values
out.iloc[evenIndex, [1,2]] = oddData.values

#Swapping columns 2 & 3
col2 = out.loc[:,1].copy()
col3 = out.loc[:,2].copy()

out.loc[:,1] = col3.values
out.loc[:,2] = col2.values

Окончательный вывод будет выглядеть как

     0    1    2    3    4
0  OAK  FLL  SEA  FLL  PBG
1  OAK  MIA  PHX  PBG  NaN
2  OAK  FLL  DFW  FLL  PBG
3  OAK  ORD  LAS  PBG  NaN

Если вы хотите вывод в виде списка,

out.apply(lambda x : list(x.dropna().values), axis = 1)
0    [OAK, PHX, MIA, FLL, PBG]
1         [OAK, SEA, FLL, PBG]
2    [OAK, LAS, ORD, FLL, PBG]
3         [OAK, DFW, FLL, PBG]
4         [OAK, DFW, FLL, PBG]
...