圆形pandas数据框字符串类型列中的数值

时间:2017-04-25 18:01:04

标签: python pandas dataframe

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

说我的数据框如下:

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

寻找像

这样的输出
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) 

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

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

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

我需要在水平方向上将3附加到一个数据框中,然后将其作为新的csv展开,并用空行分隔。

我的3个数据框如下:

一:

enter image description here

二:

enter image description here

三:

enter image description here

enter image description here

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

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

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

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

这两个选项,

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

    df = df.round()

  2. 不起作用,需要找到一种方法来仅舍入每列中的数值

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

    1. 在'read_csv()'中不包含'header = None',然后我可以舍入每个数据帧,但无法将它们与其标题水平组合。
    2. 有什么建议吗?

      csv示例

      Resources:
          <% include ./partials/resources.yml %>
          ...

1 个答案:

答案 0 :(得分: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

以下dtypes保持不变

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)