【问题标题】:Round pandas dataframe numeric values in string type columns字符串类型列中的圆形熊猫数据框数值
【发布时间】:2017-04-25 18:01:03
【问题描述】:

我确实搜索了在线帖子,但我发现的都是如何只在混合数据框中舍入浮点列,但我的问题是如何舍入字符串类型列中的浮点值。

这样说我的数据框:

pd.DataFrame({'a':[1.1111,2.2222, 'aaaa'], 'b':['bbbb', 2.2222,3.3333], 'c':[3.3333,'cccc', 4.4444]})

寻找类似的输出

pd.DataFrame({'a':[1.1,2.2, 'aaaa'], 'b':['bbbb', 2.2,3.3], 'c':[3.3,'cccc', 4.4]})

----上面是一个直接的问题-----

----我这样做的原因如下----

我有 3 个 csv 文件,每个文件都有字符串标题和浮点值,具有不同的行号和列号。

我需要将 3 水平附加到一个数据帧中,然后将其作为新的 csv 导出,并用空行分隔。

我的 3 个数据框是这样的:


一个:

两个:

三:

请注意,输出数据帧包含来自 3 个子数据帧的标头

所以,当我导入它们时,第一个 csv 当然是由 pd.read_csv 导入的,没问题。

然后我使用 .append(pd.Series([np.NaN])) 创建一个空行作为分隔符行

然后加载第二个 csv,然后我使用 pd.append(),但如果我在“read_csv()”中不包含“header=None”,那么第二个将不会水平映射到第一个下方,因为 csv文件的行和列不均匀。

所以两个选项,

  1. 在'read_csv()'中包含'header=None',那么我不能简单地使用round()作为

    df = df.round()

不行,需要想办法只对每一列的数值进行四舍五入

另请注意,当包含 'header=None' 时, 所有列类型都是“对象”,按 df.types

  1. 在“read_csv()”中不包含“header=None”,然后我可以对每个数据帧进行四舍五入,但无法将它们与标题水平组合。

有什么建议吗?


csv 示例

import pandas as pd
import io
exp = io.StringIO("""
month;abc;cba;fef;sefe;yjy;gtht
100;0.45384534;0.43455;0.56385;0.5353;0.523453;0.53553
200;0.453453;0.453453;0.645396;0.76786;0.36327;0.453659
""")

df = pd.read_csv(exp, sep=";", header=None)
print(df.dtypes)    
df = df.applymap(lambda x: round(x, 1) 
    if isinstance(x, (int, float)) else x)
print(df) 

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    有一种简单的方法可以使用 applymap 遍历数据框中的每个元素。结合对特定类型进行测试的 isinstance,可以得到以下结果。

    df = pd.DataFrame({'a':[1.1111,2.2222, 'aaaa'], 'b':['bbbb', 2.2222,3.3333], 'c':[3.3333,'cccc', 4.4444]})
    
    df.dtypes
    
    a    object
    b    object
    c    object
    dtype: object
    
    df2 = df.applymap(lambda x: round(x, 1) if isinstance(x, (int, float)) else x)
    

    获取以下数据框:

          a     b     c
    0   1.1  bbbb   3.3
    1   2.2   2.2  cccc
    2  aaaa   3.3   4.4
    

    以下数据类型不变

    df2.dtypes
    
    a    object
    b    object
    c    object
    dtype: object
    

    至于您问题中的其他示例,我注意到即使数字也保存为字符串。我注意到一种将字符串转换为浮点数的方法pd.to_numeric 用于Series

    从您的exp,我得到以下信息:

    df = pd.read_csv(exp, sep=";", header=None)
    df2 = df.apply(lambda x: pd.to_numeric(x, errors='ignore'), axis=1)
    df3 = df2.applymap(lambda x: round(x, 1) if isinstance(x, (int, float)) else x)
    

    【讨论】:

    • 感谢您的回复。但是它不起作用。刚刚通过(df.dtypes)检查了列类型,它们都是'对象'
    • 这很奇怪,因为它对我有用,即使列 dtypes 是“对象”。 applymap (不简单地应用)应该在元素上循环,并识别一个数字是一个浮点数/整数。您可以使用我的解决方案发回您的代码和生成的错误消息吗?
    • 我发现了不同之处,我的数据帧是从 csv 读取的,csv 文件具有字符串标题和浮点值。如果我使用 pd.read_csv('input/service.txt', sep=";") 和你的代码,它就可以工作;如果我使用 pd.read_csv('input/service.txt', sep=";", header=None),那么它不会。没有 'header=None' 的 df.dtypes 是 int64 和 float64,而 'header=None' 的 df.dtypes 都是对象
    • 我知道您的列 dtypes 是对象,但是通过元素查看,如果您正在测试的元素是浮点/整数,python 应该通过 isinstance 识别。例如,如果我将 df 设置为: df = pd.DataFrame({'a':[1.1111,2.2222, 'aaaa'], 'b':['bbbb', 2.2222,3.3333], 'c':[ 3.3333,'cccc', 4.4444]}) 我将为每一列得到一个对象的 df.dtypes。但是,如果我写以下内容: type(df.iloc[0,0]) 我得到一个浮点数,证明 isintance 应该能够工作。
    • 您可以尝试发送您的 txt 文件吗?
    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多