【问题标题】:how to make list of lists from pandas dataframe, skipping nan values如何从熊猫数据框中制作列表列表,跳过nan值
【发布时间】:2018-01-07 13:05:12
【问题描述】:

我有一个看起来很像的 pandas 数据框

    foo   foo2   foo3  foo4
a   NY    WA     AZ    NaN
b   DC    NaN    NaN   NaN
c   MA    CA     NaN   NaN

我想对这个数据框的观察做一个嵌套列表,但省略 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

【问题讨论】:

    标签: list pandas dataframe nested nan


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

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

      df.stack().groupby(level=0).apply(list).tolist()
      
      [['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]
      

      ​___

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

      df.applymap(lambda x: [x] if pd.notnull(x) else []).sum(1).tolist()
      
      [['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]
      

      选项 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']]
      

      【讨论】:

        【解决方案3】:

        这是一个矢量化版本!

        original = pd.DataFrame(data={
            'foo': ['NY', 'DC', 'MA'],
            'foo2': ['WA', np.nan, 'CA'],
            'foo3': ['AZ', np.nan, np.nan],
            'foo4': [np.nan] * 3,
        })
        
        out = original.copy().fillna('NAN')
        
        # Build up mapping such that each non-nan entry is mapped to [entry]
        #   and nan entries are mapped to []
        unique_entries = np.unique(out.values)
        mapping = {e: [e] for e in unique_entries}
        mapping['NAN'] = []
        
        # Apply mapping
        for c in original.columns:
            out[c] = out[c].map(mapping)
        
        # Concatenate the lists along axis 1
        out.sum(axis=1)
        

        你应该得到类似的东西

        0    [NY, WA, AZ]
        1            [DC]
        2        [MA, CA]
        dtype: object
        

        【讨论】:

          猜你喜欢
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-16
          • 2018-12-18
          • 2019-05-21
          • 2020-08-08
          • 1970-01-01
          相关资源
          最近更新 更多