首页 > 解决方案 > 熊猫用数据框替换问题

问题描述

我通过从 csv 读取它来创建一个数据框。我过滤了时间戳并得到了一个新的数据帧副本,试图在新的数据帧中替换 2019 年到 2018 年,但它不起作用。为什么?

ranks = pd.read_csv("/tmp_file.csv")
print(ranks)
mask=(ranks["Date/Time"] > pd.Timestamp(start_time)) & (ranks["Date/Time"] < pd.Timestamp(end_time)) & (ranks["Op/sc"]>100) 
df = ranks.loc[mask]
print(df)
df.replace(regex=r'2019.*$', value='2018', inplace=True) 
print(df)

排名:

        Date/Time        Rank  Op/sc
0 2019-03-18 03:07:57     0      6
1 2019-03-18 03:08:12     0      5
2 2019-03-18 03:08:27     0      4
3 2019-03-18 03:08:42     0      4
4 2019-03-18 03:08:57     0      7

df

            Date/Time       Rank  Op/sc
25    2019-03-18 03:14:12     0    160
26    2019-03-18 03:14:27     0    103
27    2019-03-18 03:14:42     0    129
32    2019-03-18 03:15:57     0    119

替换后的df

             Date/Time       Rank  Op/sc
25    2019-03-18 03:14:12     0    160
26    2019-03-18 03:14:27     0    103
27    2019-03-18 03:14:42     0    129
32    2019-03-18 03:15:57     0    119

标签: pandas

解决方案


您需要Date/Time先将列转换为日期时间:

ranks = pd.read_csv("/tmp_file.csv", parse_dates=['Date/Time'])

然后将字符串转换为Timestamps不必要的:

mask=(ranks["Date/Time"] > start_time) & (ranks["Date/Time"] < end_time) & (ranks["Op/sc"]>100)
df = ranks[mask].copy()

最后更换年份2019使用2018

mask1 = df["Date/Time"].dt.year == 2019
df.loc[mask1, "Date/Time"] = df.loc[mask1, "Date/Time"] - pd.offsets.DateOffset(years=1)

如果所有年份2019都不需要过滤:

df["Date/Time"] = df["Date/Time"] - pd.offsets.DateOffset(years=1)

编辑:

mask1 = df["Date/Time"].dt.year == 2019
df.loc[mask1, "Date/Time"] = df.loc[mask1, "Date/Time"].iat[0]

推荐阅读