Python 从列表列表中的数据帧值生成(列id、值)元组

Python 从列表列表中的数据帧值生成(列id、值)元组,python,pandas,dataframe,Python,Pandas,Dataframe,我想将pandas数据帧中的每个值转换为以下形式的元组:(col_id,val),其中col_id是列的整数顺序,val就是该位置的值,并以列表的形式输出,忽略val==0的元组 例如: 0 1 2 3 document0001 48 0 3 0 document0002 0 4 0 0 输出: [[(0,48), (2,3)], [(1,4)]] 我

我想将
pandas
数据帧中的每个值转换为以下形式的元组:
(col_id,val)
,其中
col_id
是列的整数顺序,
val
就是该位置的值,并以列表的形式输出,忽略
val==0
的元组

例如:


                   0   1   2   3
document0001      48   0   3   0
document0002       0   4   0   0
输出:

                    
[[(0,48), (2,3)],
 [(1,4)]]
我想我可以使用
apply
迭代或编写自定义函数来生成元组,但必须有更好的方法。

这样做了

  • 转置并计算一个新列,该列不选择零值
  • 迭代转置数据帧的其他列
  • 输出

    [[('0', 48), ('2', 3)], [('1', 4)]]
    
    读取数据:

    df = pd.DataFrame([[48, 0, 3, 0], [0, 4, 0, 0]], index=['document0001', 'document0002'], columns=['0', '1', '2', '3'])
    
    将行转换为列(转置):

    将列合并为一个值,假设始终有一个值为零。如果没有零,则此方法不起作用:

    sdf =pd.DataFrame(ndf['document0001']+ndf['document0002']).reset_index(drop=True)
    
    打开元组列表中的值:

    sdf[(sdf.T != 0).any()].to_records()
    
    预期产出:

    记录数组([(0,48),(1,4),(2,3)],
    dtype=[('index','您的示例显示每一列至少有一个零。这对您的整个数据正确吗,或者预期的输出也可以是[[(0,48),(2,3,1)],[(1,4)]?这不是保证的,我可以保证每一行中至少有一个非零值。在任何情况下都不应该有
    (2,3,1)
    三元组,所有元组必须在行上,您的示例将转换为输出的第二行
    (1,4)旁边的另一个
    (2,1)
    --顺序是不相关的。我希望这足够清楚。谢谢你,但这会输出一个
    列表
    ,因此文档边界丢失。它应该返回一个
    列表
    ,其中每个内部列表对应一个文档。好吧-尽管我不喜欢在熊猫中迭代,love solution会做你想做的事情尽管如此,但我写道我正在寻找的不是pandas中的低级迭代,我也和你一样讨厌这种风格;但是谢谢!你的答案很有用。非常感谢,虽然保持
    列表中
    文档
    行的边界很重要,但是
    列表
    中的
    行的边界,但是你提供的代码的输出de是一个平面的
    列表
    。。
    sdf =pd.DataFrame(ndf['document0001']+ndf['document0002']).reset_index(drop=True)
    
    sdf[(sdf.T != 0).any()].to_records()