【发布时间】: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