очистка данных перед слиянием со строками панд / питона - PullRequest
0 голосов
/ 02 октября 2019

для набора данных, считанного из csv, например,

id     street       suburb        postcode   timeStamp
A1      aa            BB            001       2016
A1      aa            BB            001       2019

Я должен объединить строки с одним и тем же идентификатором, а в случае конфликта значений использовать последний. Так что набор данных после объединения должен быть:

 id     street       suburb        postcode   timeStamp
A1      aa            BB            001       2019

, но набор данных в CSV:

id     street            suburb        postcode   timeStamp
A1      aa                 BB            001      2016
A1      aa BB 001          None           None    2019 

люди могут ввести полный адрес в столбце улицы. Я думаю, что мне нужно очистить данные перед объединением этих двух строк.

Вот моя текущая версия, я не рассматривал вышеупомянутую ситуацию до объединения.

import pandas as pd

test = pd.read_csv("dd.csv")
df = pd.DataFrame(test)
df = df.sort_values(["id","timeStamp"])
duplicateRowsDF = df[df.duplicated(keep=False,subset='id')]
df=df.ffill().drop_duplicates('id',keep='last')

Как мне очистить данные таким образом? Я думаю, что если значение в этом столбце заканчивается цифрами, переместите цифры в почтовый индекс, а слово перед почтовым индексом в столбец пригорода ...

Новое в программировании и в стеке потока, дайте мне знать, если не ясно,Спасибо

редактировать: что если в пригороде может быть более одного слова, как я могу отделить пригород от улицы? разделить улицу после таких слов, как 'St', 'Rd'etc?

    id     street                      suburb        postcode   timeStamp
A1      aa St                      pitt town       001      2016
A1      aa St pitt town  001       None           None      2019 

1 Ответ

1 голос
/ 02 октября 2019

Если значения на улице всегда разделяются знаком «», то вы можете использовать метод split и получить нужное значение для каждого столбца. Затем вы можете использовать метод отбрасывания дубликатов и передать подмножество столбцов, которые вы хотите использовать в качестве определения для дубликата.

# Use only if 'None' is an actual string in your data
df = df.replace('None', np.nan)


df['suburb'] = df['suburb'].where(~df.suburb.isnull(), df.street.str.split().str[1])
df['postcode'] = df['postcode'].where(~df.postcode.isnull(), df.street.str.split().str[2])
df['street'] = df['street'].str.split().str[0]

df.head()

| id | street | suburb | postcode | timeStamp |
|----|--------|--------|----------|-----------|
| A1 | aa     | BB     | 001      | 2016      |
| A1 | aa     | BB     | 001      | 2019      |

df.drop_duplicates(subset=['id', 'street', 'suburb', 'postcode'], keep='last')

| id | street | suburb | postcode | timeStamp |
|----|--------|--------|----------|-----------|
| A1 | aa     | BB     | 001      | 2019      |
...