我搜索了在线帖子,但我发现的是如何只在混合数据框中舍入浮点列,但我的问题是如何在字符串类型列中舍入浮点值。
说我的数据框如下:
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个数据框如下:
一:
二:
三:
到
请注意,输出数据帧包含来自3个子数据帧的标题
所以,当我导入它们时,首先当然是由pd.read_csv导入的csv,没问题。
然后我用.append(pd.Series([np.NaN]))创建一个空行作为分隔符行
然后加载第二个csv然后我使用了pd.append(),但是如果我在'read_csv()'中没有包含'header = None'那么第二个将不会在第一个下面水平映射,因为csv文件的行和列不均匀。
这两个选项,
在'read_csv()'中包含'header = None',然后我不能简单地使用round()作为
df = df.round()
不起作用,需要找到一种方法来仅舍入每列中的数值
另请注意,当包含'header = None'时, 所有列类型都是'对象',由df.types
有什么建议吗?
csv示例
Resources:
<% include ./partials/resources.yml %>
...
答案 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)