替换 Pandas DataFrame 中的点

replacing dots in pandas dataframe

提问人:Igor Rivin 提问时间:2/7/2019 最后编辑:tdyIgor Rivin 更新时间:10/4/2022 访问量:6194

问:

我有一个如图所示的数据帧。(数字实际上是对象)。做,可以预见的是炸弹。然而,这样做似乎并不能摆脱这个点,所以我很困惑。有什么建议吗?df.treasury_rate = pd.to_numeric(df.treasury_rate)df.replace('.', np.nan)

UPDATE 需要一个关键字,当设置为执行正确的操作时,我仍然对为什么没有被替换感到困惑。pd.to_numericerrorscoerce.

更新 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
Python Pandas 数据帧

评论

1赞 DYZ 2/7/2019
请将您的数据以文本形式发布,而不是以图像形式发布。我们不想重新输入它。

答:

2赞 cullzie 2/7/2019 #1

我认为如果你想就地更新df对象,你只需要添加inplace=True

df.replace('.', np.nan, inplace=True)

否则,df.replace 将返回一个新的 dataframe,您必须将该数据帧分配给要访问的变量:

new_df = df.replace('.', np.nan)
3赞 Brandon Bertelsen 2/7/2019 #2

在这种情况下,创建一个掩码/子集并替换字符串文字比尝试使用 replace 更好。您可能还想将序列转换为数字,如果您知道除了“.”字符之外的数据是干净的,您也可以一步到位:

subs = df.treasury_rate == "."
df.loc[subs, 'treasure_rate'] = np.nan
# OR
df.treasury_rate = pd.to_numeric('treasury_rate', errors='coerce')

您可以运行最后一行并将点替换为NaN

4赞 Nusrath 2/7/2019 #3
df.replace('\.','0', regex=True,inplace=True)

我认为您必须为“.”字符提供正则表达式来替换它。

评论

0赞 Igor Rivin 2/7/2019
我仍然感到困惑 - 如果正则表达式不是真的,为什么它(熊猫)会将一个点解释为正则表达式?似乎是一个错误......
0赞 Brandon Bertelsen 2/7/2019
这不是一个错误,正如@cullzie在下面的回答中提到的,重要的部分是使用参数 inplace=True,否则结果不会存储到 df。
0赞 Nusrath 2/7/2019
@igor Rivin,如果正则表达式不是真 pandas将其解释为仅'.' char,而不是点正则表达式df0.replace('.','0')。其中 as inplace=True 只是对原始数据帧进行更改,它的工作方式类似于 df =df.replace('.','0')
0赞 Gonçalo Peres 10/4/2022 #4

给定 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 替换点。

  1. 使用正则表达式(使用 Python 的)

    import re
    
    df_new = df.replace(re.compile('\.'), np.nan)
    
  2. 使用自定义 lambda 函数和 np.nan

    import numpy as np
    
    df_new = df.treasury_rate.apply(lambda x: np.nan if x == '.' else x)
    
  3. 使用熊猫。DataFrame.replacenp.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

笔记: