微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以使用 dtype 进行赋值,以便为数字设置 -99.0,为文本设置 X 吗?

如何解决可以使用 dtype 进行赋值,以便为数字设置 -99.0,为文本设置 X 吗?

我有 20 多列数据。必须有一种非手动方式来使用数据类型,以便用 -99.0(我使用的软件将 -99.0 识别为数字缺失)和 X(我使用的软件将 X 识别为文本缺失)填充空格,如果文本.我搜索并只看到了说明所有列名称的手动方式。如果列名从未更改但从项目到项目,这将重复工作,我不会总是有相同的列或列名。试图自动化这一点。这是一个小例子:

ID 项目 来自 值1 Value2
1 AAA 0 10 15 0.578
1 AAA 10 20 7.6
2 0 100 14 0.777
2 100 200 6.5
1 ABA 0 5 22.7 0.431
1 BBB 15 20 0.8 17.4
2 0 10 1.200
2 BBB 10 20 6.9 200.8

我知道我可以这样做,但它只能做数字:

result.fillna(0,inplace=True)  

我也可以试试这个,但输入 -99.0:

dataframe[list_of_columns].replace(r'\s+',regex=True)

但是这是非常手动的,我希望这是自动化的,因为我有很多项目并且希望节省时间并且它只处理数字列,而不是文本列。

我找到了这个,但我无法将文本空白转换为“X”。我认为它会类似于我保存 list_of_columns 然后有一个 for 循环?

def recode_empty_cells(dataframe,list_of_columns):

for column in list_of_columns:
  dataframe[column] = dataframe[column].replace(r'\s+',np.nan,regex=True)
  dataframe[column] = dataframe[column].fillna(0)

return dataframe

最后我希望它看起来像这样:

ID 项目 来自 值1 Value2
1 AAA 0 10 15 0.578
1 AAA 10 20 7.6 -99.0
2 X 0 100 14 0.777
2 X 100 200 6.5 -99.0
1 ABA 0 5 22.7 0.431
1 BBB 15 20 0.8 17.4
2 X 0 10 -99.0 1.200
2 BBB 10 20 6.9 200.8

提前致谢!

解决方法

如果您的列具有正确的 dtypes,那么您可以使用 DataFrame.select_dtypes。选择数字类型并用-99 填充,然后排除数字类型并用X 填充。然后将结果连接回来并重新索引(如果您关心列排序)。

import pandas as pd
import numpy as np

df = (pd.concat([df.select_dtypes(include=np.number).fillna(-99),df.select_dtypes(exclude=np.number).fillna('X')],axis=1)
        .reindex(df.columns,axis=1))

   ID Project  From   To  Value1   Value2
0   1     AAA     0   10    15.0    0.578
1   1     AAA    10   20     7.6  -99.000
2   2       X     0  100    14.0    0.777
3   2       X   100  200     6.5  -99.000
4   1     ABA     0    5    22.7    0.431
5   1     BBB    15   20     0.8   17.400
6   2       X     0   10   -99.0    1.200
7   2     BBB    10   20     6.9  200.800

另一个有效的选择是使用 select_dtypes 获取列,然后手动填充。由于我们只关心列标签,而且一列总是有一个 dtype,我们可以只使用 .head(1)。事实证明,由于 df.select_dtypes 返回 DataFrame 的一个切片,对于较大的 DataFrame 来说它会变慢,但我们只需要一行。

num_cols = df.head(1).select_dtypes(include=np.number).columns
oth_cols = df.head(1).select_dtypes(exclude=np.number).columns

df[num_cols] = df[num_cols].fillna(-99)
df[oth_cols] = df[oth_cols].fillna('X')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。