Python Pandas转换列数据类型

时间:2016-09-26 08:34:18

标签: python python-2.7 csv pandas

我知道像这样的问题被问到了数十种类型,但到目前为止我还没有找到这个问题的答案。

我已经与Pandas一起加入了两个.csv文件,现在我想在新加入的.csv文件中添加更多列,并根据已有的数据计算值。

但是,我一直收到这个错误:

"The truth value of a is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."

现在这显然是我的列的数据类型(全部是整数)的问题,但我还没有找到一种(工作)方式将该列设置为整数。

这是我的代码:

import pandas

def nscap(ns):
    if ns <= 13:
        x = ns
    elif ns > 13:
        x = 13
    return x

df_1 = pandas.read_csv("a.csv", sep=';', names=["DWD_ID", "NS"], header=0)
df_2 = pandas.read_csv("b.csv", sep=';', names=["VEG", "DWD_ID"], header=0)
df_joined = pandas.merge(df_1, df_2, on="DWD_ID")
df_joined["NS_Cap"] = nscap(df_joined["NS"])

如果我设置

df_joined["NS_Cap"] = nscap(20)

代码工作正常

我尝试过.astype(int)或.to_numeric()等函数,但除非我的语法错误,否则它对我不起作用。

提前致谢!

2 个答案:

答案 0 :(得分:1)

与@ EdChum的评论一样,您需要使用clip(upper=13)clip_upper(13)。另一个可以帮助您长期使用此类实例的选项是将apply与lambda函数一起使用。这是一个非常好的全能方法。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(5,18,size=(5, 4)), columns=list('ABCD'))
nscap = lambda x: min(x, 13)

print df.head()
print '-' * 20

df['NSCAP'] = df['D'].apply(nscap)

print df.head()

结果:

enter image description here

记下第二个数据帧的最后两行。

希望这有帮助。

答案 1 :(得分:1)

(您的代码缺少nscap(df_joined["NS"]末尾的括号。)

@EdChum和@TheLaughingMan写道,clip_upper就是你想要的。这个答案只是解决了你得到的错误的直接原因。

在功能

def nscap(ns):
    if ns <= 13:
        x = ns
    elif ns > 13:
        x = 13
    return x

有效地ns <= 13numpy.ndarray进行操作。将这样的数组与标量进行比较时,会发生广播,结果是一个数组,其中每个元素指示它是否为真。

所以

if ns <= 13:

转换为类似

的内容
if numpy.array([True, False, True, True]):

并且无法理解这是否属实。这就是你得到的错误:你需要指明你是否意味着所有条目是否为真,某些条目是否为真,等等。