【问题标题】:Creating a new column consisting of lists in a DataFrame using pandas使用 pandas 在 DataFrame 中创建一个由列表组成的新列
【发布时间】:2017-03-27 13:47:54
【问题描述】:

鉴于以下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 很长,所以我正在寻找速度。谢谢。

【问题讨论】:

  • df['newCol'] = df.t.map(np.arange) + 1

标签: python python-3.x pandas dataframe apply


【解决方案1】:

这是使用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]

【讨论】:

    【解决方案2】:

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

    获取更快的 numpy 访问值
    v = df.t.values
    [3 5]
    获取 @987654325 的累积总和@
    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:])
    

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 2021-04-15
      • 1970-01-01
      • 2015-12-05
      • 2021-12-22
      • 1970-01-01
      • 2015-03-09
      • 2016-02-10
      • 2017-09-08
      相关资源
      最近更新 更多