pandas 将 Dataframe 的非空值作为单列获取

deikduxw  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(191)

我有一个sparse Dataframe ,希望将所有非空值作为一列。请看我制作的说明问题的图片。我设法使用下面的python代码解决了这个问题。但是,我觉得可能有一些更好的|更简单的|有效的解决方法

import pandas as pd

list1 = ["x1","x2","?","?","?","?"]
list2 = ["?","?","y1","y2","?","?"]
list3 = ["?","?","?","?","z1","z2"]

df_sparse = pd.DataFrame({"A":list1,"B":list2,"C":list3})
values_vect = []
for col in df_sparse.columns:
  values = [ i for i in list(df_sparse[col]) if i !="?"]
  values_vect.extend(values)
df_sparse["D"] = pd.DataFrame(values_vect,columns=["D"])
display(df_sparse)
neekobn8

neekobn81#

df_sparse["D"] = df_sparse.replace("?", np.nan).ffill(axis="columns").iloc[:, -1]
  • 将“?“替换为NaN
  • 沿着列向前填充值,以便非NaN值将滑动到最右侧的位置
  • 查询最右边的列,即值所在的列

得到

>>> df_sparse

    A   B   C   D
0  x1   ?   ?  x1
1  x2   ?   ?  x2
2   ?  y1   ?  y1
3   ?  y2   ?  y2
4   ?   ?  z1  z1
5   ?   ?  z2  z2
42fyovps

42fyovps2#

使用掩码stackgroupby.last

df_sparse['D'] = (df_sparse
 .where(df_sparse.ne('?'))
 .stack()
 .groupby(level=0).last()
 )

print(df_sparse)

输出:

A   B   C   D
0  x1   ?   ?  x1
1  x2   ?   ?  x2
2   ?  y1   ?  y1
3   ?  y2   ?  y2
4   ?   ?  z1  z1
5   ?   ?  z2  z2

相关问题