删除pandas DataFrame中的嵌套数组

时间:2017-02-17 01:13:55

标签: python pandas data-structures dataframe

我试图将.mat文件转换为pandas DataFrame,但.mat文件的结构使其难以解开。目前,DataFrame看起来像这样

                          A
2008-01-02                [1]
2008-01-03                [2]
2008-01-04                [3]
2008-01-07                [4]
2008-01-08                [5]

看起来每列中包含的值都包含在它们自己的数组中? .dtype是返回对象。我最终想要聚合我的列,但由于它们不是数字我不能执行数字函数调用。有关如何在保留DataFrame结构的同时从数组结构中删除值的任何想法?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,每个条目都是一个包含在Python列表中的元素,并且您希望将该元素从列表中取出,以便每个条目都是标量。

您可以使用df.applymap功能实现此目的。请注意,此函数适用于整个数据框

df = df.applymap(lambda x: x[0]) # If same operation is to be used on all columns

如果您只想对某些列执行转换,则可以改为使用series.map

for some columns:
    df['column name'] = df['column name'].map(lambda x: x[0])

在任何一种情况下,您可能必须事后更改列的dtype才能使用它们;从列表更改为单个元素,可以保留列的object dtype。如果是这种情况,您可以使用:

df['column name'] = df['column name'].astype([new type])

答案 1 :(得分:0)

您可以使用this issue方法对数据框的列应用操作。

您需要定义function,然后将其传递给apply方法,具体取决于object的类型。例如,如果它是一个列表,您可能想要选择第一个项目,如果它是一个字符串,您可能想要提取并转换该数字。

答案 2 :(得分:0)

这似乎有效

df = pd.DataFrame(data)
unnested_lst = []
for col in df.columns:
    unnested_lst.append(df[col].apply(pd.Series).stack())
result = pd.concat(unnested_lst, axis=1, keys=df.columns)
result
                            A
2008-01-02     0            1
2008-01-03     0            2
2008-01-04     0            3
2008-01-07     0            4
2008-01-08     0            5

不确定如何删除零的索引列。有什么想法吗?