将可变大小的数组写入Pandas单元格

时间:2016-08-31 11:57:15

标签: python pandas

我有一个大型数据集,我想使用符合条件的多行进行卷积计算。我需要先计算每一行的向量,我认为将数据存储在数据帧列中会更有效,所以我可以尝试在进行卷积时避免使用for循环。麻烦的是,向量是可变长度的,我无法弄清楚如何去做。

以下是我的数据摘要:

Date        State  Alloc P
2012-01-01  AK     3     0.5
2012-01-01  AL     4     0.3
…

每个州都有不同的Alloc和P值。每个日期和状态都有一行,我的数据帧超过15,000行。

对于每个条目,我想要一个看起来像这样的矢量:

[P, np.zeros(Alloc), 1-P]

我无法弄清楚如何设置这样的新列。我尝试过这样的陈述:

df['Test'] = [df['P'], np.zeros(df['Alloc'), 1 – df['P']]

但它们不起作用。

有没有人有任何想法?

谢谢☺

2 个答案:

答案 0 :(得分:1)

尝试:

def get_vec(x):
    return [x.P] + np.zeros(x['Alloc']).tolist() + [1 - x.P]

df.apply(get_vec, axis=1)

0         [0.5, 0.0, 0.0, 0.0, 0.5]
1    [0.3, 0.0, 0.0, 0.0, 0.0, 0.7]
dtype: object
df['Test'] = df.apply(get_vec, axis=1)
df

enter image description here

答案 1 :(得分:1)

所以这就是答案。 piRSquared几乎是正确的,但并不完全正确。这里有几个部分。

apply方法部分有效。它将一行传递给函数,您可以进行如上所示的计算。问题是,你得到一个“ValueError:传递值的形状是......”错误信息。返回的列数与数据框中的列数不匹配。我猜这是因为返回值是一个列表而Pandas没有正确地解释结果。

解决方法是对单个列执行apply。此单列应包含P值和Alloc值。以下是步骤:

创建合并列:

df['temp'] = df[['P','Alloc']].values.tolist()

写一个函数:

def array_p(x): return [x[0]] + [0]*int(x[1]) + [1 - x[0]]

(需要int,因为上一行给出了浮点数。我不需要np.zeros)

应用功能:

df['Array'] = temp['temp'].apply(array_p)

这样可行,但显然涉及的步骤多于应有的步骤。如果有人能提供更好的答案,我很乐意听到。