gpt4 book ai didi

python - 更改 DataFrame 中的多列

转载 作者:行者123 更新时间:2023-12-01 08:49:34 25 4
gpt4 key购买 nike

我是 Python 初学者,今天第一次涉足 Pandas。我想要做的是将几列从字符串转换为 float 。这是一个简单的示例:

import numpy as np
import pandas as pd

def convert(str):
try:
return float(str.replace(',', ''))
except:
return None

df = pd.DataFrame([
['A', '1,234', '456,789'],
['B', '1' , '---' ]
], columns=['Company Name', 'X', 'Y'])

我想将 XY 转换为 float 。现实中有更多的列,而且我并不总是知道 XY 的列名称,因此我必须使用整数索引。

这有效:

df.iloc[:, 1] = df.iloc[:, 1].apply(convert)
df.iloc[:, 2] = df.iloc[:, 2].apply(convert)

这不会:

df.iloc[:, 1:2] = df.iloc[:, 1:2].apply(convert)
# Error: could not broadcast input array from shape (2) into shape (2,1)

是否可以同时在多个列上应用 convert 函数?

最佳答案

你的逻辑有几个问题:

  1. 切片 1:2 排除 2,与列表切片或 slice 对象语法一致。请改用 1:3
  2. 通过 pd.Series.apply 将逐元素函数应用于序列。要将逐元素函数应用于数据框,您需要 pd.DataFrame.applymap
  3. 从不影子内置函数:使用 mystrx 而不是 str 作为变量或参数名称.
  4. 当您使用 try/ except 构造时,通常应指定错误类型,在本例中为 ValueError。<

因此,这是一种解决方案:

def convert(x):
try:
return float(x.replace(',', ''))
except ValueError:
return None

df.iloc[:, 1:3] = df.iloc[:, 1:3].applymap(convert)

print(df)

Company Name X Y
0 A 1234 456789
1 B 1 NaN

但是,您的逻辑效率低下:您应该尽可能利用按列操作。这可以通过 pd.DataFrame.apply 以及应用于每个系列的 pd.to_numeric 来实现:

def convert_series(x):
return pd.to_numeric(x.str.replace(',', ''), errors='coerce')

df.iloc[:, 1:3] = df.iloc[:, 1:3].apply(convert_series)

print(df)

Company Name X Y
0 A 1234 456789
1 B 1 NaN

关于python - 更改 DataFrame 中的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53180998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com