pandas 重复日期问题
pandas and trouble with duplicate dates
我有一个包含以下示例输出的 csv 文件:
3/12/1970
3/1/1942
10/20/1945 10/20/1945
10/27/1960
10/5/1952
我用 df = pd.read_csv(filename).
将它放入 pandas
我知道上面提到的有两个日期的行。此列的数据类型是 pandas 中的对象。
当尝试将此列转换为 pandas 中的日期时间格式时,我在所有具有此双日期问题的行上遇到错误,必须在 csv 中逐一查找和编辑它们。
所以,我尝试了以下方法来清除我的 50K 行中有这个双日期问题的所有行:
df[col] = df[col].str.strip()
df[col] = df[col].str[:10]
根本不影响任何双重日期。
我还尝试计算列中每个值的长度,然后如果生成的列长度超过 10,则简单地删除日期值。不过,双日期行仍然存在。
我还尝试了以下方法来定位此特定行以进一步检查它,但此代码导致 0 行。
bad_dates = df[df[col].str.contains('10/20/1945')]
那么,有什么创意来清理这些双重日期吗? (它发生在可能有一百个随机分布的列值)
有测试文件
col
3/12/1970
3/1/1942
10/20/1945 10/20/1945
10/27/1960
10/5/1952
另存为/project/test/test.csv
import pandas as pd
df = pd.read_csv('~/project/test/test.csv')
给予
col
0 3/12/1970
1 3/1/1942
2 10/20/1945 10/20/1945
3 10/27/1960
4 10/5/1952
那么你的例子
df['fixed'] = df['col'].str[:10]
给予
col fixed
0 3/12/1970 3/12/1970
1 3/1/1942 3/1/1942
2 10/20/1945 10/20/1945 10/20/1945
3 10/27/1960 10/27/1960
4 10/5/1952 10/5/1952
基本上这是有效的,你的情况有所不同,导致了差异。
您可以使用拆分来执行此操作。
split()
将每一行 (str)
拆分为由空格分隔的值列表,然后 [-1] 仅选择最后一个值,这消除了所有额外值并仅保留单个值需要。
df['col'].apply(lambda x: x.split()[-1])
我有一个包含以下示例输出的 csv 文件:
3/12/1970
3/1/1942
10/20/1945 10/20/1945
10/27/1960
10/5/1952
我用 df = pd.read_csv(filename).
将它放入 pandas我知道上面提到的有两个日期的行。此列的数据类型是 pandas 中的对象。 当尝试将此列转换为 pandas 中的日期时间格式时,我在所有具有此双日期问题的行上遇到错误,必须在 csv 中逐一查找和编辑它们。 所以,我尝试了以下方法来清除我的 50K 行中有这个双日期问题的所有行:
df[col] = df[col].str.strip()
df[col] = df[col].str[:10]
根本不影响任何双重日期。
我还尝试计算列中每个值的长度,然后如果生成的列长度超过 10,则简单地删除日期值。不过,双日期行仍然存在。
我还尝试了以下方法来定位此特定行以进一步检查它,但此代码导致 0 行。
bad_dates = df[df[col].str.contains('10/20/1945')]
那么,有什么创意来清理这些双重日期吗? (它发生在可能有一百个随机分布的列值)
有测试文件
col
3/12/1970
3/1/1942
10/20/1945 10/20/1945
10/27/1960
10/5/1952
另存为/project/test/test.csv
import pandas as pd
df = pd.read_csv('~/project/test/test.csv')
给予
col
0 3/12/1970
1 3/1/1942
2 10/20/1945 10/20/1945
3 10/27/1960
4 10/5/1952
那么你的例子
df['fixed'] = df['col'].str[:10]
给予
col fixed
0 3/12/1970 3/12/1970
1 3/1/1942 3/1/1942
2 10/20/1945 10/20/1945 10/20/1945
3 10/27/1960 10/27/1960
4 10/5/1952 10/5/1952
基本上这是有效的,你的情况有所不同,导致了差异。
您可以使用拆分来执行此操作。
split()
将每一行 (str)
拆分为由空格分隔的值列表,然后 [-1] 仅选择最后一个值,这消除了所有额外值并仅保留单个值需要。
df['col'].apply(lambda x: x.split()[-1])