2017-01-26 68 views
0

我想將一個Dataframe的多個列組合到一個,其中包含這些列的數組。熊貓將多個列結合到數組結果的ValueError

的這個簡單的例子:

sn | a | b | c | 
---+-----+-----+-----+ 
a1 | 1 | 1 | None| 

sn | a | b | c | array | 
---+-----+-----+-----+-----------+ 
a1 | 1 | 1 | None| [1,1,None]| 

我想是因爲我用熊貓(和SQL-鍊金術)來分析我的數據和寫入數據框成一個PostgreSQL做到這一點 - 使用Dataframe.to_sql的表。我在Postgres中使用numeric [],text [],integer []等測試了這個列,並且to_sql用NULL替換了None,所以這個工作原理完全按照預期工作。

要做到這一點,我寫這個簡單的功能:

def timeseries(collist): 
output = [] 
for col in collist: 
    if str(col) in ['nan','None','NaT']: 
     col = None 
    output.append(col) 
return output 

dataframe['arraycolumn'] = dataframe.apply(lambda row: timeseries(row[collist1]), axis=1) 

沒什麼可抱怨的,直到我想保存時間戳陣列(之前只是保存爲文本[])。我得到這些時間戳的格式不正確,並使用pd.to_datetime(df ['timestampcolumn']),因爲Postgresql偏好ISO時間戳(試圖在timestamp []列中保存此時間戳)。但是在使用pd.to_datetime進行投射後,我的功能不再有效。

collist = ['a','datetime'] 
df['c'] = df.apply(lambda row: timeseries(row[collist]), axis=1) 

ValueError: Shape of passed values is (...), indices imply (...) 

予製備的ipynb:https://github.com/cherryskizz/pandasarrayproblem/blob/master/theproblem.ipynb

我與Python 3.4.4,3.5.2測試此,熊貓18.1和19.0。

我可以編寫一個函數來解析這些列而不使用pd.to_datetime,但也許有其他方法可以解決這個問題嗎?有沒有熊貓功能來實現這一點?

回答

1

調查了一下之後,它似乎在嘗試創建新的DataFrame時出現了一個錯誤,由於某些原因索引和列混在一起。然而,當我這樣做對我有用:

# transpose and apply column wise 
df['c'] = df.T.apply(lambda row: timeseries(row[collist]), axis=0) 

很奇怪,但對我來說它的工作。

+1

確實很奇怪,但它的工作原理。感謝你的努力,但我現在要解決這個問題。也許有人可以解釋爲什麼索引和列會混淆或找到另一個解決方案。 – CherrySkizz