使用 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:])
给出以下 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:])