如何从熊猫数据框中制作列表列表,跳过 nan 值

Eri*_*rin 3 nested list nan dataframe pandas

我有一个看起来大致像的熊猫数据框

    foo   foo2   foo3  foo4
a   NY    WA     AZ    NaN
b   DC    NaN    NaN   NaN
c   MA    CA     NaN   NaN
Run Code Online (Sandbox Code Playgroud)

我想对这个数据框的观察进行嵌套列表,但省略 NaN 值,所以我有类似 [['NY','WA','AZ'],['DC'],[' MA',CA']。

此数据框中有一个模式,如果这有所不同,则如果 fooX 为空,则后续列 fooY 也将为空。

我最初有类似下面的代码。我确定有更好的方法来做到这一点

A = [[i] for i in subset_label['label'].tolist()]
B = [i for i in subset_label['label2'].tolist()]
C = [i for i in subset_label['label3'].tolist()]
D = [i for i in subset_label['label4'].tolist()]
out_list = []
for index, row in subset_label.iterrows():
out_list.append([row.label, row.label2, row.label3, row.label4])
out_list
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 7

尝试这个:

In [77]: df.T.apply(lambda x: x.dropna().tolist()).tolist()
Out[77]: [['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

选项 1
pd.DataFrame.stack默认丢弃 na。

df.stack().groupby(level=0).apply(list).tolist()

[['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]
Run Code Online (Sandbox Code Playgroud)

?___

选项 2
有趣的替代方案,因为我认为对 pandas 对象中的列表求和很有趣。

df.applymap(lambda x: [x] if pd.notnull(x) else []).sum(1).tolist()

[['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]
Run Code Online (Sandbox Code Playgroud)

选项 3
numpy实验

nn = df.notnull().values
sliced = df.values.ravel()[nn.ravel()]
splits = nn.sum(1)[:-1].cumsum()
[s.tolist() for s in np.split(sliced, splits)]

[['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]
Run Code Online (Sandbox Code Playgroud)