Замена строк из панд номерами перед парой строк в списке - PullRequest
4 голосов
/ 04 апреля 2019

Учитывая следующие панды df:

import pandas as pd

df = pd.DataFrame({'1' : ['title1','R','R','R'],
               '2' : ["title2", "NR" ,"NR", "NR"],
               '3' : ["title3", "R" , "NR", "NR"],
               '4' : ["title4", "R", "NR", "R"]})

И более длинный список строк:

List = ['2633', 'title1', '3327', 'title2', '18', 'title3', '5', 'title4', '5835', 'title5', '394', 'title6']

Есть ли какая-либо возможность в среде Python заменить заголовки в df номером перед каждым заголовком пары в списке строк.

Ожидаемый результат:

dfnew = pd.DataFrame({'1' : ['2633','R','R','R'],
               '2' : ["3327", "NR" ,"NR", "NR"],
               '3' : ["28", "R" , "NR", "NR"],
               '4' : ["5", "R", "NR", "R"]})

dfnew
    1    2      3   4
0   2633 3327   28  5
1   R    NR     R   R
2   R    NR     NR  NR
3   R    NR     NR  R

Я предполагаю, что regex справится с задачей, но я не знаю, как получить правильные номера из списка.

Спасибо за любую помощь заранее!

Ответы [ 3 ]

7 голосов
/ 04 апреля 2019

Создайте dict из четных и нечетных индексов в качестве пары ключ-значение и используйте replace для замены title на numbers:

d = {k:v for k,v in zip(List[1::2], List[::2])}

print(df.replace(d))

Выход:

     1     2   3   4                                                                                                                 
0  2633  3327  18   5                                                                                                                 
1     R    NR   R   R                                                                                                                 
2     R    NR  NR  NR                                                                                                                 
3     R    NR  NR   R  

Объяснение

List[1::2] даст вам элементы с нечетными индексами из списка ['title1', 'title2', 'title3', 'title4', 'title5', 'title6']

И

List[::2] даст вам элементы по четным индексам из списка ['2633', '3327', '18', '5', '5835', '394']

5 голосов
/ 04 апреля 2019

Я бы сделал что-то вроде этого:

import pandas as pd

df = pd.DataFrame({'1' : ['title1','R','R','R'],
               '2' : ["title2", "NR" ,"NR", "NR"],
               '3' : ["title3", "R" , "NR", "NR"],
               '4' : ["title4", "R", "NR", "R"]})
List = ['2633', 'title1', '3327', 'title2', '18', 'title3', '5', 'title4', '5835', 'title5', '394', 'title6']

# mapping every title with its number
mydict = {}
for i in range(len(List)) :
    if i %2 == 0 :
        mydict[List[i+1]] = List[i]

print mydict
#>>>{'title1': '2633', 'title2': '3327', 'title3': '18', 'title4': '5', 'title5': '5835', 'title6': '394'}

for k in df :
    title = df[k][0]
    df[k][0] = mydict[title]

print df
#>>>      1     2   3   4
#>>>0  2633  3327  18   5
#>>>1     R    NR   R   R
#>>>2     R    NR  NR  NR
#>>>3     R    NR  NR   R
0 голосов
/ 04 апреля 2019
List = [item.replace("title", "") for item in List]

выход:

['2633', '1', '3327', '2', '18', '3', '5', '4', '5835', '5', '394', '6']

Если вы хотите подать заявку на DF, вам просто нужно поменять список на колонку DF

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