首页 > 解决方案 > 需要熊猫中的行值列表

问题描述

我有什么,我需要什么

我有一个p带有 cols的 pandas DataFrame 'a''b', 'c'(存储在 中的列名pc)。

从那我想创建一个pn相同形状的 DataFrame,但每个单元格都是来自选定行的值列表。DataFramen告诉我ppn.

import pandas as pd

pc = ['a', 'b', 'c']
p  = pd.DataFrame([[11, 12, 13],
                   [21, 22, 23]],
                  columns=pc,
                  index=[1001,
                         1002])

n  = pd.DataFrame([[[1001]      ],
                   [[1001, 1002]]],
                  columns=['sel_row'],
                  index=[1001,
                         1002])

可以(并且想要)实现的目标

我能得到的最远......给了我一个列列表,而不是行。那么,我是否混淆了嵌套for循环?

pn = pd.DataFrame([ [p.loc[ix, pc].values for ix in n.loc[indx].values[0]] 
                    for indx in n.index ])

print (pn)

# The actual output:
#               0             1
# 0  [11, 12, 13]          None
# 1  [11, 12, 13]  [21, 22, 23]

# The required output:
#           0         1         2
# 0  [11]      [12]      [13]
# 1  [11, 21]  [12, 22]  [13, 23]

杂念

也许我也应该迭代类似p.loc[ix, c] ... for c in pc......但怎么会有3个循环?

另一个(可选的)愿望

这也可能lambda吗?我的直觉是:那会更快——但不确定!

感谢您解决问题或提供的任何帮助。

标签: pythonpandaslistdataframe

解决方案


您可以分解n,使用它来切片p和分组:

s = n['sel_row'].explode()
p.loc[s].groupby(s.index).agg(list)

输出:

             a         b         c
1001      [11]      [12]      [13]
1002  [11, 21]  [12, 22]  [13, 23]

推荐阅读