更改DataFrame中的多个列

时间:2018-11-06 22:23:19

标签: python pandas

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

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转换为浮点型。现实中有更多列,而且我并不总是知道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 个答案:

答案 0 :(得分:1)

您的逻辑存在几个问题:

  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