如何在数据框列中移除子字符串?

21

我有一个简化的数据框:

ID, Date
1 8/24/1995
2 8/1/1899 :00

我该如何运用pandas的功能,以识别数据框中任何具有额外的:00并去除它。

有什么好的解决方法吗?

我尝试了以下语法但没有成功:

df[df["Date"].str.replace(to_replace="\s:00", value="")]

输出应该是这样的:

ID, Date
1 8/24/1995
2 8/1/1899

你是自己创建数据框吗?因为在创建数据框之前,你可以删除多余的“:00”。 - Harrison
我正在使用 pd.read.csv() 将一个 .csv 文件读取为数据框,但是我注意到有些日期在读取为数据框之前实际上带有多余的 :00 - MEhsan
2个回答

33

您需要将经过修剪的列重新分配回原始列,而不是进行子集操作,另外 str.replace 方法似乎没有 to_replacevalue 参数。相反,它具有 patrepl 参数:

df["Date"] = df["Date"].str.replace("\s:00", "")

df
#   ID       Date
#0   1  8/24/1995
#1   2   8/1/1899

对于基于正则表达式的表达式,请不要忘记在replace方法中加上regex = True。 - undefined

5
要应用到整个数据帧,我会使用stack然后unstack
df.stack().str.replace(r'\s:00', '').unstack()

在此输入图片描述

功能化

def dfreplace(df, *args, **kwargs):
    s = pd.Series(df.values.flatten())
    s = s.str.replace(*args, **kwargs)
    return pd.DataFrame(s.values.reshape(df.shape), df.index, df.columns)

示例

df = pd.DataFrame(['8/24/1995', '8/1/1899 :00'], pd.Index([1, 2], name='ID'), ['Date'])

dfreplace(df, '\s:00', '')

enter image description here


rng = range(5)
df2 = pd.concat([pd.concat([df for _ in rng]) for _ in rng], axis=1)

df2

enter image description here

dfreplace(df2, '\s:00', '')

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接