提问人:Igor Rivin 提问时间:2/7/2019 最后编辑:tdyIgor Rivin 更新时间:10/4/2022 访问量:6194
替换 Pandas DataFrame 中的点
replacing dots in pandas dataframe
问:
我有一个如图所示的数据帧。(数字实际上是对象)。做,可以预见的是炸弹。然而,这样做似乎并不能摆脱这个点,所以我很困惑。有什么建议吗?df.treasury_rate = pd.to_numeric(df.treasury_rate)
df.replace('.', np.nan)
UPDATE 需要一个关键字,当设置为执行正确的操作时,我仍然对为什么没有被替换感到困惑。pd.to_numeric
errors
coerce
.
更新 2作为文本:
treasury_rate
1962-02-09 4.05
1962-02-10 4.05
1962-02-11 4.05
1962-02-12 .
1962-02-13 4.03
1962-02-14 4.03
1962-02-15 4.02
1962-02-16 4.02
1962-02-17 4.02
1962-02-18 4.02
答:
我认为如果你想就地更新df对象,你只需要添加inplace=True:
df.replace('.', np.nan, inplace=True)
否则,df.replace 将返回一个新的 dataframe,您必须将该数据帧分配给要访问的变量:
new_df = df.replace('.', np.nan)
在这种情况下,创建一个掩码/子集并替换字符串文字比尝试使用 replace 更好。您可能还想将序列转换为数字,如果您知道除了“.”字符之外的数据是干净的,您也可以一步到位:
subs = df.treasury_rate == "."
df.loc[subs, 'treasure_rate'] = np.nan
# OR
df.treasury_rate = pd.to_numeric('treasury_rate', errors='coerce')
您可以运行最后一行并将点替换为NaN
df.replace('\.','0', regex=True,inplace=True)
我认为您必须为“.”字符提供正则表达式来替换它。
评论
给定 OP 的数据帧
import pandas as pd
import datetime as dt
df = pd.DataFrame({'treasury_rate': [4.05, 4.05, 4.05, ".", 4.03, 4.03, 4.02, 4.02, 4.02, 4.0]},
index=[dt.datetime(1962, 2, 9), dt.datetime(1962, 2, 10), dt.datetime(1962, 2, 11), dt.datetime(1962, 2, 12), dt.datetime(1962, 2, 13), dt.datetime(1962, 2, 14), dt.datetime(1962, 2, 15), dt.datetime(1962, 2, 16), dt.datetime(1962, 2, 17), dt.datetime(1962, 2, 18)])
[Out]:
treasury_rate
1962-02-09 4.05
1962-02-10 4.05
1962-02-11 4.05
1962-02-12 .
1962-02-13 4.03
1962-02-14 4.03
1962-02-15 4.02
1962-02-16 4.02
1962-02-17 4.02
1962-02-18 4.0
有多种方法可以用 NaN 替换点。
-
import re df_new = df.replace(re.compile('\.'), np.nan)
使用自定义 lambda 函数和
np.nan
import numpy as np df_new = df.treasury_rate.apply(lambda x: np.nan if x == '.' else x)
使用
熊猫。DataFrame.replace
和np.nan
import numpy as np df_new = df.replace('.', np.nan) # or df_new = df.replace(to_replace=r'\.', value=np.nan, regex=True)
在所有三种情况下,输出均为
treasury_rate
1962-02-09 4.05
1962-02-10 4.05
1962-02-11 4.05
1962-02-12 NaN
1962-02-13 4.03
1962-02-14 4.03
1962-02-15 4.02
1962-02-16 4.02
1962-02-17 4.02
1962-02-18 4.00
笔记:
如果想对同一个数据帧进行操作,可以使用
inplace=True
df.replace(re.compile('\.'), np.nan)
Pandas 有自己的 null 值。因此,人们可能希望使用
pd 而不是 np.nan
。不适用
。有关这两者之间区别的更多信息:pd。熊猫的 NA 与 np.nan 如果使用 ,则输出将是pd.NA
treasury_rate 1962-02-09 4.05 1962-02-10 4.05 1962-02-11 4.05 1962-02-12 <NA> 1962-02-13 4.03 1962-02-14 4.03 1962-02-15 4.02 1962-02-16 4.02 1962-02-17 4.02 1962-02-18 4.0
对使用有强烈的意见。如果有人想阅读一些:我什么时候(不)应该在我的代码中使用 pandas apply()?
.apply
评论