有没有办法在不满足条件的情况下替换避免 nan 的值?

Is there a way to replace values avoiding nan where the condition is not met?

我正在尝试替换噪声值 (',') 以将数据框列转换为数字列。当 str.replace 使用 nan 覆盖所有不包含任何逗号的值时会出现问题。

说明问题:

import pandas as pd

data = {
    'transaction_number': [1344, '1,345', 1346, '1,347'],
    'date': ['2018-12-01 14:03:38',    '2018-12-01 12:38:12',
'2018-12-04 13:19:46',   ' 2018-12-04 12:23:09']
}

df = pd.DataFrame(data)
print(df)

输出:

    transaction_number  date
0   1344    2018-12-01 14:03:38
1   1,345   2018-12-01 12:38:12
2   1346    2018-12-04 13:19:46
3   1,347   2018-12-04 12:23:09

我尝试的第一件事:

df.transaction_number = df.transaction_number.replace(',', '')

#i tried this equivalet too:
df.transaction_number.replace(',', '', inplace = True)

他们都没有对数据进行任何转换(也就是说,他们什么也没做)。如果有人能告诉我为什么,我将不胜感激。

最后我尝试了(str 方法):

df.transaction_number = df.transaction_number.str.replace(',','')

和returns:

    transaction_number  date
0   NaN    2018-12-01 14:03:38
1   1345   2018-12-01 12:38:12
2   NaN    2018-12-04 13:19:46
3   1347   2018-12-04 12:23:09

我不知道发生了什么以及为什么会这样,我想要的结果是:

    transaction_number  date
0   1344    2018-12-01 14:03:38
1   1345    2018-12-01 12:38:12
2   1346    2018-12-04 13:19:46
3   1347    2018-12-04 12:23:09

请帮忙,感谢您的阅读!

发生这种情况是因为您的列具有混合数据类型。我们可以将其全部转换为字符串(使用 .astype(str)),然后应用替换。

import pandas as pd

data = {
    'transaction_number': [1344, '1,345', 1346, '1,347'],
    'date': ['2018-12-01 14:03:38',    '2018-12-01 12:38:12',
'2018-12-04 13:19:46',   ' 2018-12-04 12:23:09']
}

df = pd.DataFrame(data)
df.transaction_number = df.transaction_number.astype(str).str.replace(",","")
print(df)

输出

  transaction_number                  date
0               1344   2018-12-01 14:03:38
1               1345   2018-12-01 12:38:12
2               1346   2018-12-04 13:19:46
3               1347   2018-12-04 12:23:09

您需要在 replace

上选择 regex=True
df['transaction_number'] = df.transaction_number.replace(',', '', regex=True)

Out[12]:
                   date transaction_number
0   2018-12-01 14:03:38               1344
1   2018-12-01 12:38:12               1345
2   2018-12-04 13:19:46               1346
3   2018-12-04 12:23:09               1347