如何过滤下面的 tolist
或 values
以仅获取非零值
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]))
只返回非零值。但是不知道如何在上面的代码中应用它
答案 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