繁体   English   中英

使用pandas创建一个包含DataFrame中列表的新列

[英]Creating a new column consisting of lists in a DataFrame using pandas

给定以下DataFrame

   t
0  3
1  5

我想创建一个新列,其中wach条目是一个列表,它是它所在行的函数。特别是它应该有一个列表,其中所有正整数不大于列t的条目。 所以输出应该是:

   t  newCol
0  3  [1,2,3]
1  5  [1,2,3,4,5]

换句话说,我想将list(range(1,t+1))应用于每一行。 我知道如何在循环中执行它,但有一个很长的DataFrame ,所以我在寻找速度。 谢谢。

这是使用NumPy方法的矢量化方法 -

a = df.t.values
idx = a.cumsum()
id_arr = np.ones(idx[-1],dtype=int)
id_arr[idx[:-1]] = -a[:-1]+1
df['newCol'] = np.split(id_arr.cumsum(),idx[:-1])

样品运行 -

In [76]: df
Out[76]: 
   t                 newCol
0  4           [1, 2, 3, 4]
1  3              [1, 2, 3]
2  7  [1, 2, 3, 4, 5, 6, 7]
3  2                 [1, 2]
4  5        [1, 2, 3, 4, 5]
5  3              [1, 2, 3]

这与@Divakar的答案非常接近,但我相信它更直观一些。

获取更快的numpy访问的值
v = df.t.values
[3 5]
获得v累积总和
cumsum = v.cumsum()
[3 8]
得到一些差异
用于跟踪拆分并稍后采取差异
diffs = cumsum - v
[0 3]
编制一个很大的累积金额
这是最终值的起点
prevals = np.ones(cumsum[-1], dtype=int).cumsum()
[1 2 3 4 5 6 7 8]
最后,拆分并放置
df['new_col'] = np.split(prevals - np.repeat(diffs, v), diffs[1:])
在此输入图像描述


全部一起

df = pd.DataFrame(dict(t=[4, 3, 7, 2, 5, 3]))
v = df.t.values
cumsum = v.cumsum()
diffs = cumsum - v
prevals = np.ones(cumsum[-1], dtype=int).cumsum()
df['new_col'] = np.split(prevals - np.repeat(diffs, v), diffs[1:])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM