Как изменить порядок записи данных с помощью регулярного выражения и объединить ее в один кадр данных? - PullRequest
2 голосов
/ 15 мая 2019

Что я хочу знать, так это то, как я могу использовать вышеуказанный фрейм данных с регулярным выражением, чтобы расположить строки данных в правильном порядке.Как вы можете видеть, например, по индексам 2 и 4, количество и количество находятся в неправильном порядке.Кто-нибудь есть какие-либо идеи, как я могу это исправить?

data = [['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'],['Total 8\r\r\nPiece 2\r\r\nQuantity 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nPiece 2\r\r\nQuantity 4'],['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'],['Total 8\r\r\nPiece 2\r\r\nQuantity 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nPiece 2\r\r\nQuantity 4']] 
df = pd.DataFrame(data, columns = ['Information']) 
df 

+-------+--------------------------------------+
| index |             Information              |
+-------+--------------------------------------+
|     0 | Total 8\r\r\nQuantity 2\r\r\nPiece 4 |
|     1 | Total 8\r\r\nQuantity 2\r\r\nPiece 4 |
|     2 | Total 8\r\r\nPiece 2\r\r\nQuantity 4 |
|     3 | Total 8\r\r\nQuantity 2\r\r\nPiece 4 |
|     4 | Total 8\r\r\nPiece 2\r\r\nQuantity 4 |
|     5 | Total 8\r\r\nQuantity 2\r\r\nPiece 4 |
|     6 | Total 8\r\r\nQuantity 2\r\r\nPiece 4 |
|     7 | Total 8\r\r\nPiece 2\r\r\nQuantity 4 |
|     8 | Total 8\r\r\nQuantity 2\r\r\nPiece 4 |
|     9 | Total 8\r\r\nPiece 2\r\r\nQuantity 4 |
+-------+--------------------------------------+


dt = pd.DataFrame(df)
data = []
for item in dt['Information']:
    regex = re.findall(r"(\d+)\D+(\d+)\D+(\d+)",item)
    quantity = re.findall(r"\bTotal\s?\d\D+(\bQuantity)",item)
    piece = re.findall(r"\bTotal\s?\d\D+(\bPiece)",item)
    regex = (map(list,regex))
    data.append(list(map(int,list(regex)[0])))
dftotal = pd.DataFrame(data, columns=['Total','Quantity','Piece'])
print(dftotal)

С этим кодом я получил столбец, как показано ниже

+-------+----------+-------+
| Total | Quantity | Piece |
+-------+----------+-------+
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
+-------+----------+-------+ 

Как я могу получить кадр данных, как показано ниже, переключив те неправильнозаказать из de 'data array' и поместить правильные переменные в один фрейм данных?

+-------+----------+-------+   
| Total | Quantity | Piece |
+-------+----------+-------+
|     8 |        2 |     4 |
|     8 |        4 |     2 |
|     8 |        2 |     4 |
|     8 |        4 |     2 |
|     8 |        2 |     4 |
|     8 |        2 |     4 |
|     8 |        4 |     2 |
|     8 |        2 |     4 |
|     8 |        4 |     2 |
+-------+----------+-------+

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Это один подход с использованием str.extract

Ex:

import pandas as pd

data = [['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'],['Total 8\r\r\nPiece 2\r\r\nQuantity 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nPiece 2\r\r\nQuantity 4'],['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'],['Total 8\r\r\nPiece 2\r\r\nQuantity 4'], ['Total 8\r\r\nQuantity 2\r\r\nPiece 4'], ['Total 8\r\r\nPiece 2\r\r\nQuantity 4']] 
df = pd.DataFrame(data, columns = ['Information'])

df["Total"] = df["Information"].str.extract(r"Total (\d+)")
df["Quantity"] = df["Information"].str.extract(r"Quantity (\d+)")
df["Piece"] = df["Information"].str.extract(r"Piece (\d+)")
df.drop("Information", inplace=True, axis=1)
print(df)

Выход:

  Total Quantity Piece
0     8        2     4
1     8        2     4
2     8        4     2
3     8        2     4
4     8        4     2
5     8        2     4
6     8        2     4
7     8        4     2
8     8        2     4
9     8        4     2
1 голос
/ 15 мая 2019

На самом деле исходные данные близки к CSV-файлу, где разделитель будет пробелом. Как только данные загружены таким образом, их поворота будет достаточно, чтобы получить то, что вы хотите.

Так что я бы сделал:

df = pd.read_csv(io.StringIO('\r\r\n'.join((line[0] for line in data))),
                 sep=' ', header=None)

df['n'] = (df.index / 3).astype(np.int32)

result = df.pivot('n', 0, 1)

Результатом является следующий фрейм данных:

0  Piece  Quantity  Total
n                        
0      4         2      8
1      4         2      8
2      2         4      8
3      4         2      8
4      2         4      8
5      4         2      8
6      4         2      8
7      2         4      8
8      4         2      8
9      2         4      8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...