Python 更改数据帧中的多个列

Python 更改数据帧中的多个列,python,pandas,Python,Pandas,我是Python的初学者,今天第一次进入熊猫世界。我要做的是将多个列从string转换为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,7

我是Python的初学者,今天第一次进入熊猫世界。我要做的是将多个列从string转换为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'])
我想将
X
Y
转换为浮点。现实中有更多的列,我并不总是知道
X
Y
的列名,所以我必须使用整数索引

这项工作:

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:2
    排除
    2
    ,与列表切片或
    slice
    对象语法一致。改用
    1:3
  • 通过works将元素函数应用于序列。要将元素相关函数应用于数据帧,您需要
  • 从不隐藏内置:使用
    mystr
    x
    而不是
    str
    作为变量或参数名
  • 当您使用
    try
    /
    结构时,通常应指定错误类型,在本例中为
    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
    
    但是,您的逻辑效率很低:您应该尽可能利用列操作。这可以通过以下方式实现,并应用于每个系列:


    为什么不使用
    astype
    ?您是如何读取数据的?不过,使用参数为“千”的read_csv可能会做些小动作?使用
    applymap
    并以这种方式处理错误?你最终还是会遇到混合类型?@roganjosh,是的,我添加了推荐的系列解决方案。这里的最终产品是相同的,因为(显然)熊猫确实在
    applymap
    之后重铸为
    float
    。不过,我不相信这一点,这也是使用系列方法的另一个原因。Python和Pandas对我来说是全新的。谢谢你的帮助help@MikeHenderson,没问题,我的大部分观点都是Python的通用观点(不仅仅与熊猫有关),所以希望它能在其他地方帮助您。
    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