【问题标题】:data clean before merge to rows pandas/python在合并到行 pandas/python 之前清理数据
【发布时间】:2019-10-02 11:54:16
【问题描述】:

对于从csv读取的数据集,例如,

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

我应该合并具有相同id的行,如果值冲突,使用最新的。所以合并后的数据集应该是:

 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 

人们可能会在街道列中输入整个地址。 我想我需要在合并这 2 行之前清理数据。

这里是我目前的版本,合并前没有考虑以上情况。

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')

我应该如何清理这样的数据? 我在想如果此列中的值以数字结尾,请将数字移至邮政编码,将邮政编码前的单词移至郊区列...

编程和 stackoverflow 的新手,如果不清楚,请告诉我。 谢谢

编辑: 如果郊区可能不止一个词怎么办,我怎么能把郊区和街道分开呢?在“St”、“Rd”等词之后分割街道?

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

【问题讨论】:

  • 我认为您当前的代码无法处理一些边缘情况,例如仅出现一次的 id 的不完整数据(郊区为 None)。在这种情况下,ffill() 将填充下一行,即使它是不同的 ID。另外,您发布的示例是否总是数据脏的情况,还是有其他可能性? street 列是否总是包含郊区和邮政编码信息?如果是这样,我将首先使用split() 函数来标记street 的内容并复制到其他列。
  • 是的,当前代码会因边缘情况而中断,这就是为什么我想在 ffill() 之前填充所有空的。(这是我能想出的唯一方法......)是的,这是这些数据列脏的唯一情况。但我认为拆分线路可能很困难,请参阅更新问题。谢谢~~

标签: pandas csv dataframe data-cleaning


【解决方案1】:

如果 street 中的值总是用 " " 分隔,那么您可以使用 split 方法并获取每列所需的值。然后,您可以使用 drop duplicates 方法并传入要用作确定是否重复的列的子集。

# 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      |

【讨论】:

  • 谢谢!是的,所有数据都带有空郊区和邮政编码的原因,因为他们将郊区和邮政编码放在街道上。不过实际情况比较复杂,郊区可能不止一个字。 ....我正在考虑在“道路”、“街道”、“驱动器”等之后拆分单词,这可以识别街道的尽头。你觉得有可能吗?
猜你喜欢
  • 2017-03-21
  • 2013-08-21
  • 1970-01-01
  • 2018-12-23
  • 2019-06-01
  • 2016-04-23
  • 1970-01-01
  • 2023-03-21
  • 2021-06-25
相关资源
最近更新 更多