numpy Pandas将多个库仑的指数值替换为常数

iezvtpos  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(96)

有一些测试数据的CSV文件和一些列有错误值记录。想要替换特定列中的错误值,如+/-9.900000e+37,name匹配模式,使用-9999。
我现在用的是下面的

import pandas as pd
import numpy as np
df_1 = pd.read_csv('test_file.csv', sep='\t')    
df_1['Abc11'] = np.where(df_1['Abc11'] > 9999, -9999, df_1['Abc11'])

有超过50列的模式,是否有一个容易的更新所有列一次
输入:
| Abc11| ABC12| Abc13| ABC14| ABC15| Abc16| ABC16| xyz|评论|
| --|--|--|--|--|--|--|--|--|
| 13.3435|-9.900000e+37|七三二一四|-9.900000e+37|-9.900000e+37|-9.900000e+37|-9.900000e+37| 0.3435|三|
| -9.900000e+37|-9.900000e+37| 98999999999993400000000000000000000.000000|-9.900000e+37|-9.900000e+37|-9.900000e+37|-9.900000e+37| 0.3435|三|
| 13.3435|-9.900000e+37|七三二一四|9.900000 e +37|-9.900000e+37|-9.900000e+37| 9.900000 e +37| 0.3435|三|
| 13.3435|-9.900000e+37| 98999999999993400000000000000000000.000000| 9.900000 e +37|-9.900000e+37|-9.900000e+37| 9.900000 e +37| 0.3435|三|
| 9.900000 e +37|-9.900000e+37| 98999999999993400000000000000000000.000000|-9.900000e+37|-9.900000e+37|-9.900000e+37|-9.900000e+37| 0.3435|三|
如果列名以ABC开头|Abc和值> 9999或< -9999,则替换为-9999
所需输出:相同名称模式的列数可以超过50
| Abc11| ABC12| Abc13| ABC14| ABC15| Abc16| ABC16| xyz|评论|
| --|--|--|--|--|--|--|--|--|
| 13.3435|九九九九|七三二一四|九九九九|九九九九|九九九九|九九九九|0.3435|三|
| 九九九九|九九九九|九九九九|九九九九|九九九九|九九九九|九九九九|0.3435|三|
| 13.3435|九九九九|七三二一四|九九九九|九九九九|九九九九|九九九九|0.3435|三|
| 13.3435|九九九九|九九九九|九九九九|九九九九|九九九九|九九九九|0.3435|三|
| 九九九九|九九九九|九九九九|九九九九|九九九九|九九九九|九九九九|0.3435|三|

nukf8bse

nukf8bse1#

您可以使用str.match查找名称以abc开头的列(在任何情况下),然后使用numpy.where将超出范围的值设置为-9999

import numpy as np

abc_cols = df.columns[df.columns.str.match('^abc', case=False)]
df[abc_cols] = np.where(df[abc_cols].abs() > 9999, -9999, df[abc_cols])

输出量:

Abc11   ABC12      Abc13   ABC14   Abc15   Abc16   ABC16     xyz  comments
0    13.3435 -9999.0     7.3214 -9999.0 -9999.0 -9999.0 -9999.0  0.3435    Three
1 -9999.0000 -9999.0 -9999.0000 -9999.0 -9999.0 -9999.0 -9999.0  0.3435    Three
2    13.3435 -9999.0     7.3214 -9999.0 -9999.0 -9999.0 -9999.0  0.3435    Three
3    13.3435 -9999.0 -9999.0000 -9999.0 -9999.0 -9999.0 -9999.0  0.3435    Three
4 -9999.0000 -9999.0 -9999.0000 -9999.0 -9999.0 -9999.0 -9999.0  0.3435    Three
iq3niunx

iq3niunx2#

这可能有助于

df_1 = pd.read_csv('test_file.csv', sep='\t')

# Define the naming pattern
pattern = '^(ABC|Abc)\\d+$'

# Get the list of column names that match the pattern
matching_columns = [col for col in df_1.columns if pd.Series([col]).str.match(pattern).any()]

# Apply the replacement logic using applymap()
df_1[matching_columns] = df_1[matching_columns].applymap(lambda x: -9999 if (x > 9999 or x < -9999) else x)

相关问题