【问题标题】:Pandas Combining multiple Columns to Array results in ValueErrorPandas 将多列组合成数组导致 ValueError
【发布时间】: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


    【解决方案1】:

    经过一番调查,它在尝试创建新的 DataFrame 时似乎存在错误,由于某些原因,索引和列混淆了。但是,当我这样做时,它对我有用:

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

    很奇怪,但对我来说它有效。

    【讨论】:

    • 确实很奇怪,但它确实有效。感谢您的努力,但我现在让这个问题开放。也许有人可以解释为什么索引和列会混淆或找到另一种解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多