Python 将numpy.array存储在Pandas.DataFrame的单元格中

Python 将numpy.array存储在Pandas.DataFrame的单元格中,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个数据帧,我想在其中存储“raw”numpy.array: df['COL_ARRAY'] = df.apply(lambda r: np.array(do_something_with_r), axis=1) 但似乎熊猫试图“解包”numpy.array 有解决办法吗?除了使用包装器之外(请参见下面的编辑) 我尝试了reduce=False,但没有成功 编辑 这是可行的,但我必须使用'dummy'Data类来包装数组,这既不令人满意,也不是很优雅 class Data: def

我有一个数据帧,我想在其中存储“raw”
numpy.array

df['COL_ARRAY'] = df.apply(lambda r: np.array(do_something_with_r), axis=1)
但似乎熊猫试图“解包”numpy.array

有解决办法吗?除了使用包装器之外(请参见下面的编辑)

我尝试了
reduce=False
,但没有成功

编辑

这是可行的,但我必须使用'dummy'
Data
类来包装数组,这既不令人满意,也不是很优雅

class Data:
    def __init__(self, v):
        self.v = v

meas = pd.read_excel(DATA_FILE)
meas['DATA'] = meas.apply(
    lambda r: Data(np.array(pd.read_csv(r['filename'])))),
    axis=1
)

在numpy数组周围使用包装器,即将numpy数组作为列表传递

a = np.array([5, 6, 7, 8])
df = pd.DataFrame({"a": [a]})
输出:

a 0 [5, 6, 7, 8]
    1
1   [5, 6, 7, 8]
输出:

a b id new 0 on on 1 [on, on, 1] 1 on off 2 [on, off, 2] 2 off on 3 [off, on, 3] 3 off off 4 [off, off, 4]
array(['on', 'on', '1'], dtype='<U2')
输出:

a b id new 0 on on 1 [on, on, 1] 1 on off 2 [on, off, 2] 2 off on 3 [off, on, 3] 3 off off 4 [off, off, 4]
array(['on', 'on', '1'], dtype='<U2')

array(['on','on','1',dtype='您可以将数据框数据参数包装在方括号中,以在每个单元格中维护
np.array

one_d_array = np.array([1,2,3])
two_d_array = one_d_array*one_d_array[:,np.newaxis]
two_d_array

array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])


pd.DataFrame([
    [one_d_array],
    [two_d_array] ])

                                   0
0                          [1, 2, 3]
1  [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

假设您有一个数据帧
ds
,它有一个名为“class”的列包含字符串或数字,您希望使用
numpy.ndarray
s或
list
s对其进行更改,以下代码会有所帮助。在代码中,
class2vector
numpy.ndarray
list
ds_class
是一个过滤条件


ds['class']=ds['class'].map(lambda x:class2vector if(isinstance(x,str)和(x==ds_class))else x)
只需通过第一个
应用
将要存储在单元格中的内容包装到一个
列表
对象中,然后通过该
列表的
索引0
到第二个
应用
:

import pandas as pd
import numpy as np

df = pd.DataFrame({'id': [1, 2, 3, 4],
                   'a': ['on', 'on', 'off', 'off'],
                   'b': ['on', 'off', 'on', 'off']})


df['new'] = df.apply(lambda x: [np.array(x)], axis=1).apply(lambda x: x[0])

df
输出:

    id  a       b       new
0   1   on      on      [1, on, on]
1   2   on      off     [2, on, off]
2   3   off     on      [3, off, on]
3   4   off     off     [4, off, off]

如果首先将列设置为具有类型
对象
,则可以插入数组而无需任何换行:

df = pd.DataFrame(columns=[1])
df[1] = df[1].astype(object)
df.loc[1, 1] = np.array([5, 6, 7, 8])
df
输出:

a 0 [5, 6, 7, 8]
    1
1   [5, 6, 7, 8]

这是可行的,但是我宁愿使用一个虚拟类而不是列表。如果你不使用
tuple(r)
而使用
np.array([[1,2],[3,4]])
,也就是说,一个2维数组?
tuple(r)
也可以使用二维数组。你是说替换tuple(r)吗使用2D np.array?是的。我的意思是,我理解您的解决方案,而且它是有效的,但是如果我想在
new
列中使用2D np.array(而不是如图所示的1D数组),该怎么办?你能在你的问题中添加预期的输出吗?如果你想创建一个新的2D数组,行中的所有元素都应该是numpy数组。我的解决方案就是这样。如果它是混合类型,你必须先使用if else使它成为numpy数组。这些元素变成
列表
s否?@javadba我将上面的输出设置为
df
,然后查看
print(类型(df.iloc[0,0]))
-->这是Pandas 0.23.0。你看到了与另一个版本不同的东西吗?事实上你是对的-一个更高投票率的答案听起来像是ndarray会转换成一个列表。我刚刚测试了这一点。
没有
我们在
df
中得到的
正如你所说,我们得到了
ndarray
s