2016-09-26 143 views
1

我知道這樣的問題已經被問到了多少類型,但到目前爲止我還沒有能夠找到這個問題的答案。Python Pandas轉換列數據類型

我已經加入了兩個.csv文件和Pandas,現在我想添加更多列到新加入的.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(),但除非我的語法錯誤,否則不適用於我。

在此先感謝!

+1

嗨,歡迎來到Stack Overflow。 IIUYC,你想*應用*'nscap'到'NS'列來獲得'NS_Cap',我是否正確? – Manhattan

+2

你在'df_joined ['NS_Cap'] = df_joined ['NS']。clip_upper(13)'後面':參見:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.clip_upper .html這裏的錯誤是你試圖用一個理解標量值的運算符比較一個數組,如果你做了'df_joined ['NS']。apply(nscap)''那麼它應該可以工作 – EdChum

+0

這就像一個魅力!非常感謝!到目前爲止從來沒有遇到過這種語法! – Khaled

回答

1

與@ EdChum的評論一樣,您需要使用clip(upper=13)clip_upper(13)。另外一個可以幫助你長期運行的選項是使用帶有lambda函數的apply。這是一個非常漂亮的全能方法。

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

採取記下最後兩行的第二個數據幀的。

希望這會有所幫助。

+0

很好的答案。請注意,'apply' + lambda通常比矢量化函數慢得多,所以'clip_upper'可能更好。 –

+0

我嘗試了兩種選擇,是的,他們都比我以前嘗試的速度更快。因此,clip_upper(xy)不僅停止從該數字開始計數,而且還將每個數字都設置爲高於該數字? – Khaled

+0

@已認錯。你在技術上設置了一個上界和*剪切*之後的任何事情。 – Manhattan

1

(您的代碼缺少在nscap(df_joined["NS"]末尾括號。)

由於@EdChum和@TheLaughingMan寫,clip_upper是你想要的這裏。這個答案只是解決你遇到錯誤的直接原因。

在功能

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

有效,在numpy.ndarrayns <= 13操作。當你將這樣一個數組與標量進行比較時,會發生廣播,並且結果是一個數組,其中每個元素指示它是否爲真。

所以

if ns <= 13: 

轉化爲類似

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

,它是不可能瞭解這是否是真還是假。這是你得到的錯誤:你需要指定是否你的意思是如果所有條目都是真的,如果某些條目爲真,依此類推。