熊猫只爆炸列非零值

时间:2021-03-24 14:36:27

标签: python pandas

如何过滤下面的 tolistvalues 以仅获取非零值

import pandas as pd
df = pd.DataFrame({'A':[0,2,3],'B':[2,0,4], 'C': [3,4,0]})
df['D']=df[['A','B','C']].values.tolist()
df.explode('D')

数据

    A   B   C
0   0   2   3
1   2   0   4
2   3   4   0

在 D 列上爆炸时现在变成 9。但我希望输出中有 4 行

预期结果

    A   B   C   D
0   0   2   3   2
0   0   2   3   3
1   2   0   4   2
1   2   0   4   4 
2   3   4   0   3
2   3   4   0   4

我让 list(filter(None, [1,0,2,3,0])) 只返回非零值。但是不知道如何在上面的代码中应用它

2 个答案:

答案 0 :(得分:3)

index.repeat

m = df.ne(0)
df.loc[df.index.repeat(m.sum(1))].assign(D=df.values[m])

   A  B  C  D
0  0  2  3  2
0  0  2  3  3
1  2  0  4  2
1  2  0  4  4
2  3  4  0  3
2  3  4  0  4

答案 1 :(得分:2)

最简单的是query

df['D']=df[['A','B','C']].values.tolist()
df.explode('D').query('D != 0')

输出:

   A  B  C  D
0  0  2  3  2
0  0  2  3  3
1  2  0  4  2
1  2  0  4  4
2  3  4  0  3
2  3  4  0  4