【问题标题】:Extracting from lists of pandas series to another based on indexes根据索引从熊猫系列列表中提取到另一个系列
【发布时间】:2018-10-11 21:25:29
【问题描述】:

我有具有 2 个系列的 pandas 数据框,每个系列都包含 2d 数组,例如, a 是第一个系列子数组,长度不同,如

a: 
0 [[1,2,3,4,5,6,7,7],[1,2,3,4,5],[5,9,3,2]]
1 [[1,2,3],[6,7],[8,9,10]]

和 b 是第二个,但它的子数组只有一个元素,如

b:
 0 [[0],[2],[3]]
 1 [ [1],[0],[1]]

我想根据 b 中给出的索引提取 a 系列的元素。 上面例子的结果应该是这样的:

0 [1,3,2]
1 [2, 6, 9]

有人可以帮忙吗?非常感谢

【问题讨论】:

  • 你应该发布数据框而不是系列
  • 账户索引 0 [[1, 2, 3, 4, 5, 6, 7, 7], [1, 2, 3], [6, 7],[8,9,10 ]] [[3], [0], [0], [2]] 1 [[1, 2, 3, 4, 5, 6, 7, 7], [1, 2, 3]] [[4 ], [1]] 2 [[1, 2, 3, 4, 5, 6, 7, 7]] [[2]]

标签: python arrays pandas numpy multidimensional-array


【解决方案1】:

设置

a = pd.Series({0: [[1, 2, 3, 4, 5, 6, 7, 7], [1, 2, 3, 4, 5], [5, 9, 3, 2]],
               1: [[1, 2, 3], [6, 7], [8, 9, 10]]})

b = pd.Series({0: [[0], [2], [3]], 1: [[1], [0], [1]]})

由于您有不同大小的列表,因此很难提高效率,但这里有一个使用列表理解和 zip 的解决方案:

out = pd.Series([[x[y] for x, [y] in zip(i, j)] for i, j in zip(a, b)])

0    [1, 3, 2]
1    [2, 6, 9]
dtype: object

【讨论】:

  • 这个解决方案比我的想法漂亮得多,我可以哭了!干得好。
  • 非常感谢,但它给了我 IndexError: Invalid index to scalar variable
  • 那么您提供的示例并不能准确地代表您的数据。确保您的列实际上是列表而不是字符串,但此代码使用我提供的设置数据工作
  • 再次感谢大家的帮助。数组内部是 numpy 数组,请问您知道该怎么做吗?
【解决方案2】:

您可以使用apply 来索引ab

df.apply(lambda row: [row.a[i][row.b[i][0]] for i in range(len(row[0]))], axis=1)   
0    [1, 3, 2]
1    [2, 6, 9]
dtype: object

数据:

data = {"a":[[[1,2,3,4,5,6,7,7],[1,2,3,4,5],[5,9,3,2]],
             [[1,2,3],[6,7],[8,9,10]]],
        "b": [[[0],[2],[3]], 
              [[1],[0],[1]]]}
df = pd.DataFrame(data)

【讨论】:

    猜你喜欢
    • 2023-01-20
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多