我有一个大型数据集,我想使用符合条件的多行进行卷积计算。我需要先计算每一行的向量,我认为将数据存储在数据帧列中会更有效,所以我可以尝试在进行卷积时避免使用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']]
但它们不起作用。
有没有人有任何想法?
谢谢☺
答案 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
答案 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)
这样可行,但显然涉及的步骤多于应有的步骤。如果有人能提供更好的答案,我很乐意听到。