Python 3.x 替换dataframe列中的特定值,否则将列转换为数值
给定以下数据帧Python 3.x 替换dataframe列中的特定值,否则将列转换为数值,python-3.x,pandas,replace,Python 3.x,Pandas,Replace,给定以下数据帧 +----+------------------+-------------------------------------+--------------------------------+ | | AgeAt_X | AgeAt_Y | AgeAt_Z | |----+------------------+-----------------------
+----+------------------+-------------------------------------+--------------------------------+
| | AgeAt_X | AgeAt_Y | AgeAt_Z |
|----+------------------+-------------------------------------+--------------------------------+
| 0 | Older than 100 | Older than 100 | 74.13 |
| 1 | nan | nan | 58.46 |
| 2 | nan | 8.4 | 54.15 |
| 3 | nan | nan | 57.04 |
| 4 | nan | 57.04 | nan |
+----+------------------+-------------------------------------+--------------------------------+
如何用nan
替换特定列中大于100的值
+----+------------------+-------------------------------------+--------------------------------+
| | AgeAt_X | AgeAt_Y | AgeAt_Z |
|----+------------------+-------------------------------------+--------------------------------+
| 0 | nan | nan | 74.13 |
| 1 | nan | nan | 58.46 |
| 2 | nan | 8.4 | 54.15 |
| 3 | nan | nan | 57.04 |
| 4 | nan | 57.04 | nan |
+----+------------------+-------------------------------------+--------------------------------+
注释
- 从所需列中删除大于100的
字符串后,我将这些列转换为数值,以便对所述列执行计算
- 在这个dataframe中还有其他列(我从这个示例中排除了这些列),它们不会转换为数值,所以转换为数值必须一次转换一列李>
我尝试过的
尝试1
if df.isin('Older than 100'):
df.loc[df['AgeAt_X']] = ''
else:
df['AgeAt_X'] = pd.to_numeric(df["AgeAt_X"])
尝试2
if df.loc[df['AgeAt_X']] == 'Older than 100r':
df.loc[df['AgeAt_X']] = ''
elif df.loc[df['AgeAt_X']] == '':
df['AgeAt_X'] = pd.to_numeric(df["AgeAt_X"])
尝试3次
df['AgeAt_X'] = ['' if ele == 'Older than 100' else df.loc[df['AgeAt_X']] for ele in df['AgeAt_X']]
尝试1、2和3返回以下错误:
KeyError:'没有[0 NaN\n1 NaN\n2 NaN\n3 NaN\n4 NaN\n5 NaN\n6 NaN\n7 NaN\n8 NaN\n9 NaN\n10 NaN\n11 NaN\n12 NaN\n13 NaN\n14 NaN\n17 NaN\n18 NaN\n19 NaN\n20 NaN\n21 NaN\n23 NaN\n25 NaN\n26 NaN\n27 NaN\n28 NaN\n29南\n..\n6332南\n6333南\n6334南\n6335南\n6336南\n6337南\n6338南\n6339南\n6340南\n6341南\n6342南\n6343南\n6344南\n6345南\n6346南\n6347南\n6348南\n6349南\n6350南\n6351南\n6352南\n6353南\n6354南\n6355南\n6356南\n6357南\n6358南\n6359 NaN\n6360 NaN\n6361 NaN\n名称:AgeAt_X,长度:6362,数据类型:float64]在[索引]中'
尝试4次
df['AgeAt_X'] = df['AgeAt_X'].replace({'Older than 100': ''})
尝试4返回以下错误:
TypeError:无法比较类型“ndarray(dtype=float64)”和“str”
我也看了一些帖子,下面的两篇文章实际上并没有替换这个值,而是创建了一个从其他文章派生的新列
如果我理解正确,您可以使用np.nan
替换所有出现的大于100的,只需调用DataFrame.replace
。如果所有剩余值都是数值,则替换将隐式地将列的数据类型更改为数值:
# Minimal example DataFrame
df = pd.DataFrame({'AgeAt_X': ['Older than 100', np.nan, np.nan],
'AgeAt_Y': ['Older than 100', np.nan, 8.4],
'AgeAt_Z': [74.13, 58.46, 54.15]})
df
AgeAt_X AgeAt_Y AgeAt_Z
0 Older than 100 Older than 100 74.13
1 NaN NaN 58.46
2 NaN 8.4 54.15
df.dtypes
AgeAt_X object
AgeAt_Y object
AgeAt_Z float64
dtype: object
# Replace occurrences of 'Older than 100' with np.nan in any column
df.replace('Older than 100', np.nan, inplace=True)
df
AgeAt_X AgeAt_Y AgeAt_Z
0 NaN NaN 74.13
1 NaN NaN 58.46
2 NaN 8.4 54.15
df.dtypes
AgeAt_X float64
AgeAt_Y float64
AgeAt_Z float64
dtype: object
我们可以循环浏览每一列,检查句子是否存在。如果我们找到了答案,我们将句子替换为NaN
,并将其转换为数字,在本例中为float
:
df.dtypes
AgeAt_X object
AgeAt_Y object
AgeAt_Z float64
dtype: object
sent = 'Older than 100'
for col in df.columns:
if sent in df[col].values:
df[col] = df[col].str.replace(sent, 'NaN')
df[col] = df[col].astype(float)
print(df)
AgeAt_X AgeAt_Y AgeAt_Z
0 NaN NaN 74.13
1 NaN NaN 58.46
2 NaN 8.40 54.15
3 NaN NaN 57.04
4 NaN 57.04 NaN
df.dtypes
AgeAt_X float64
AgeAt_Y float64
AgeAt_Z float64
dtype: object
对于他的例子来说,这是可行的,但在转换为数字时,这是不够的,因为它不会检查每列中是否存在超过100的
。感谢@Peter Leimbigler,您的解决方案确实有效,但Erfan的解决方案也有效,但也减轻了我识别要转换为数字的列的需要,因为如果它们包含的早于100
,我本来打算转换它们。事实上,不需要显式转换为数字数据类型。如果字符串替换导致一列包含所有数字值,pandas会隐式将该列的数据类型转换为数字类型,在本例中为float64
。我已经编辑了我的回答以反映此行为。但是,对于包含类似数值和字符串的对象列,pandas
通常将1
读入为'1'
,在这种情况下,它不会得到类型转换(类似7,8;foo,9等数据)@Alollz,很好的一点,这个示例数据看起来不是这样的,但可能出现在其他列中。感谢@Erfan,这个解决方案为我节省了识别要分别转换为数字的列的步骤。很好的解决方案,但是for循环和.astype(float)
行是不必要的,因为如果替换结果是包含所有数值的列,pandas会自动将该列转换为数值数据类型。较短的解决方案是df.replace('Older than 100',np.nan,inplace=True)
是否有任何原因需要在列中保留其他非数值?如果没有,并且结果是'Older than 100'
是唯一有问题的字符串,那么方法是pd.to\u numeric(df['col\u name',errors='concure'))
@ALollz,好主意。我会试试这个,明天再报告。谢谢!@ALollz,我相信你的解决方案是目前为止最好的。从文档中,如果“强制”,则无效解析将设置为NaN
()。这正是我需要的,只需要设置一个参数,不需要额外的代码。谢谢!