Pandas последовательная манипуляция строкой с использованием Python - первые два символа переворачиваются и добавляются в конец строки - PullRequest
0 голосов
/ 09 июля 2020

У меня есть столбец (серия) значений, я пытаюсь переместить символы и быстро никуда не пойду! Я нашел несколько фрагментов кода, чтобы добраться туда, где я сейчас, но мне нужен «Closer». Я работаю с одним столбцом, типом данных (STR). Каждая строка столбца представляет собой серию чисел. Некоторые дублируются. Эти повторяющиеся числа имеют (n-) перед числом. Число (n) будет меняться в зависимости от того, сколько строк повторяющихся чисел указано. У некоторых может быть два дубликата, у некоторых восемь дубликатов. Не имеет значения, порядок должен оставаться неизменным.

Мне нужно go вниз по каждой ячейке или строке, выщипать (n-) слева от строки, поменять местами два символа и добавить это до конца строки. Сортировка номеров не требуется. Столбец состоит из 4-5 тыс. Строк и будет выглядеть как в приведенном ниже примере. Никаких других специальных символов или букв. Кроме того, повторяющиеся строки всегда будут вместе, независимо от того, где находится столбец.

Моя проблема в том, что приведенный ниже код действительно работает и будет проходить через каждую строку, оценивать его на da sh, а затем обрабатывать числа так, как мне нужно. Однако я не узнал, как вернуть изменения в мой фрейм данных из python for-l oop. Я действительно надеялся, что у кого-то есть отличное исправление лямбда или функция pandas apply для одновременного обращения ко всему столбцу. Но я не нашел ничего, что можно было бы настроить для работы. Я знаю, что есть лучший способ, чем медленное прохождение серии, и я хотел бы научиться.

Требуются два возможных исправления:

  1. Есть ли способ получить приведенный ниже код заменить старое значение df.string вновь созданным значением df.string? Если да, дайте мне знать.
  2. Я пытался прочитать df.apply, используя функцию разделения, чтобы я мог обратиться ко всему столбцу сразу. Я понимаю, что это умнее. Есть ли пара строк кода, которые бы сделали то, что мне нужно?

Пожалуйста, дайте мне знать, что вы думаете. Я ценю помощь. Спасибо, что нашли время.

import re
import pandas as pd
from pandas import DataFrame, Series
import numpy as np

df = pd.read_excel("E:\Book2.xlsx")

df.column1=df.column1.astype(str)

for r in df['column1']:            #Finds Column
if bool(re.search('-', r))!=True:  #test if string has '-' 
    continue
else:
    a = []                         #string holder for '-'
    b = []                         #string holder for numbers
    for c in r:
        if c == '-':               #if '-' then hold in A
            a.append(c)
        else:
            b.append(c)            #if number then hold in B
    t = (''.join(b + a))           #puts '-' at the end of string
    z = t[1:] + t[:1]              #picks up 1st position char and moves to end of string
    r = z                          #assigns new created string to df.column1 value

print(df)

Starting File:         Ending File:

column1                column1
41887                  41887
1-41845                41845-1
2-41845                41845-2
40905                  40905
1-41323                41323-1
2-41323                41323-2
3-41323                41323-3
41778                  41778

1 Ответ

0 голосов
/ 09 июля 2020

Вы можете использовать df.str.replace ():

Если мы воссоздадим ваш пример с файлом, содержащим все ваши значения, и сохраним column1 в качестве имени столбца:

import pandas as pd
df=pd.read_csv('file.txt')
df.columns=['column1']
df['column1']=df['column1'].str.replace('(^\d)-(\d+)',r'\2-\1')
print(df)

Это даст желаемый результат. Замените старую колонку на новую и сделайте все за один раз (без петель).

#in 
41887                 
1-41845               
2-41845                
40905               
1-41323               
2-41323                
3-41323               
41778  
#out 
    column1
0   41887
1   41845-1
2   41845-2
3   40905
4   41323-1
5   41323-2
6   41323-3
7   41778
...