【发布时间】:2017-01-26 22:46:22
【问题描述】:
我想将 Dataframe 的多列合并为一列,其中包含这些列的数组。
这个简单的例子:
sn | a | b | c |
---+-----+-----+-----+
a1 | 1 | 1 | None|
到
sn | a | b | c | array |
---+-----+-----+-----+-----------+
a1 | 1 | 1 | None| [1,1,None]|
我想这样做是因为我使用 Pandas(和 SQL-Alchemy)来解析我的数据并使用 Dataframe.to_sql 将 Dataframe 写入 Postgresql-Table。我使用 numeric[]、text[]、integer[] 等进行了测试。Postgres 和 to_sql 中的列将 None 替换为 NULL,所以这完全符合预期。
为了实现这一点,我编写了这个简单的函数:
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)
在我想保存时间戳数组(在简单地保存为 text[] 之前)之前,没有什么可抱怨的。我以错误的格式获取这些时间戳并使用 pd.to_datetime(df['timestampcolumn']) 因为 Postgresql 更喜欢 ISO-Timestamps(试图将其保存在 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、pandas 18.1 和 19.0 对此进行了测试。
我可以编写一个函数来解析这些列而不使用 pd.to_datetime,但也许还有其他方法可以解决这个问题?是否有一个 Pandas 函数来实现这一点?
【问题讨论】:
标签: python arrays python-3.x pandas