Python 需要熊猫中的行值列表 我拥有什么,我需要什么

Python 需要熊猫中的行值列表 我拥有什么,我需要什么,python,pandas,list,dataframe,Python,Pandas,List,Dataframe,我有一个熊猫数据框p,带有cols'a','b','c'(col名称存储在pc中) 基于此,我想创建一个形状相同的数据帧pn,但每个单元格都是一个列表,其中包含选定行中的值。 数据帧n告诉我要为pn中的每一行从p中选择哪些行 import pandas as pd pc = ['a', 'b', 'c'] p = pd.DataFrame([[11, 12, 13], [21, 22, 23]], columns=pc

我有一个熊猫数据框
p
,带有cols
'a'
'b'
'c'
(col名称存储在
pc
中)

基于此,我想创建一个形状相同的数据帧
pn
,但每个单元格都是一个列表,其中包含选定行中的值。 数据帧
n
告诉我要为
pn
中的每一行从
p
中选择哪些行

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]。。。对于pc中的c
。。。但是怎么会有3个循环呢

另一个(可选)愿望 对于
lambda
也可以这样做吗?我的直觉是:那会更快——但不确定

感谢您解答问题或提供帮助。

IIUC,您可以:

data = [[[*x] for x in zip(*p.loc[idxs].values)] for idxs in n['sel_row']]

result = pd.DataFrame(data=data, columns=p.columns, index=p.index)
print(result)
输出

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

您可以在这里编写自定义函数

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])
def f(idx):
    return pd.Series(p.loc[idx, :].values.T.tolist())

n.sel_row.apply(f)

             0         1         2
1001      [11]      [12]      [13]
1002  [11, 21]  [12, 22]  [13, 23]
使用
lambda
可以将上述内容重写为:

n.sel_row.apply(lambda idx: pd.Series(p.loc[idx, :].values.T.tolist()))

您可以分解
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]

我最喜欢这个答案。。。因为它看起来非常简单和易懂。只有困惑地看到,如果没有参数
idx
,如何应用
f
!用一点打印语句,我想我明白了:
idx
n.sel\u行的每个元素
!实际上我更熟悉语法:
n.sel\u row.apply(lambda idx:f(idx))
。谢谢你的捷径!!谢谢是的,那些列名和索引非常有用!