python 中的字符串浮点数到整数

String float to int in python

我有以下数据框:

数据
A(1.2,2)
B(1,5)
A(5.8, 9)
B(8.9,0.9)

我想将这些 float (str) 对象转换为 int。我该怎么做?

期望的输出:

数据
A(1,2)
B(1,5)
A(6, 9)
B(9,1)

到目前为止我尝试了什么?

pd.to_numeric(df['data'])

但我收到以下错误:ValueError: Unable to parse string "A(1,2)" at position 0我该如何解决?

您有一个字符串,首先需要将数字彼此分开,自定义函数可能是最简单的方法:

def round_string(s):
    start = s.index('(') +1
    stop = s.index(')')
    l = s[start:stop].split(',')
    lst = [str(int(round(float(i)))) for i in l]
    return s[:start] + ','.join(lst) + s[stop:]

s = "B(8.9,0.9)"
round_string(s)
# 'B(9,1)'

将函数映射到数据框:

df['data'].map(round_string)

如果不需要四舍五入,下面的应该可以,用空字符串替换小数点和小数点后的数字

df['data'].str.replace('\.\d+', '', regex=True)
0     A(1,2)
1     B(1,5)
2    A(5, 9)
3     B(8,0)
Name: col, dtype: object

为了四舍五入这些值,需要更多的努力,只需 extract 括号部分使用 regex 并将其分配给一个临时列,然后使用理解来四舍五入调用 eval 最后用给定列中的新值替换。

df.assign(tup=df['data'].str.extract('(\(.*\))')).apply(lambda x: x['data'].replace(x['tup'], str(tuple(round(i) for i in eval(x['tup'])))), axis=1)

0    A(1, 2)
1    B(1, 5)
2    A(6, 9)
3    B(9, 1)
dtype: object

所以你要做的是将嵌套在字符串中的浮点数转换为整数。

此外,您的输出表明您不想使用 int 函数,但可能 round(x,0)(我这样说是因为 int(5.8) 的计算结果为 5,而不是 6。

所以像这样应用于数据框的函数将起作用:

def convert_fn_strs(fn):
    val_list = re.split('[(,)]',fn)
    val_list.remove('')
    fn_name = val_list.pop(0)
    val_list = [round(float(x)) for i,x in enumerate(val_list)]
    return fn_name + str(tuple(val_list))```


您的字符串实际上是 namedtuples。这样对待他们

  • 定义预期的命名元组
  • 使用 pd.eval()
  • 转换为命名元组
  • 使用 f-string
  • 返回想要的字符串表示形式
  • 或者使用Series map()更改为想要的表示
df = pd.read_csv(
    io.StringIO(
        """df
A(1.2,2)
B(1,5)
A(5.8, 9)
B(8.9,0.9)"""
    ),
    sep="\t",
).rename(columns={"df": "data"})


from collections import namedtuple

A = namedtuple("A", "x y")
B = namedtuple("B", "x y")
df = pd.DataFrame(
    {
        "data": [
            f"{type(nt).__name__}({round(nt.x,0):.0f},{round(nt.y):.0f})"
            for nt in pd.eval(df["data"])
        ]
    }
)

使用map()进行舍入

df["data"] = pd.Series(pd.eval(df["data"])).map(
    lambda nt: str(nt._replace(x=int(round(nt.x, 0)), y=int(round(nt.y, 0))))
)
data
0 A(1,2)
1 B(1,5)
2 A(6,9)
3 B(9,1)