【问题标题】:Pandas turn True columns into column valuePandas 将 True 列转换为列值
【发布时间】:2021-10-13 10:07:34
【问题描述】:

我有下表的布尔值:

pd.DataFrame(data={'val1': [True, False, False, True], 
                   'val2': [False, True, False, True], 
                   'val3': [True, True, False, True], 
                   'val4': [True, False, True, False], 
                   'val5': [True, True, False, False],
                   'val6': [False, False, True, True]},
                   index=pd.Series([1, 2, 3, 4], name='index'))
index val1 val2 val3 val4 val5 val6
1 True False True True True False
2 False True True False True False
3 False False False True False True
4 True True True False False True

我想创建一个具有相同索引的新数据框,但每一行都有前一列的前三个 True 列名。

index TrueVal1 TrueVal2 TrueVal3
1 val1 val3 val4
2 val2 val3 val5
3 val4 val6 NaN
4 val1 val2 val3

如果一行的 True 值少于三个,则新数据框的值为 Null。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    尝试使用 dot ,然后使用 split

    #df = df.set_index('index')
    out = df.dot(df.columns + ',').str[:-1].str.split(',',expand=True).iloc[:,:3]
    out
    Out[258]: 
              0     1     2
    index                  
    1      val1  val3  val4
    2      val2  val3  val5
    3      val4  val6  None
    4      val1  val2  val3
    

    【讨论】:

      【解决方案2】:

      您可以使用numpy + argsort 执行此操作,以按True 值的位置对列进行切片。

      然后使用 whereNaN 的行 False 以防True 值太少。

      import numpy as np
      import pandas as pd
      
      # Get the first `N` True columns.
      N = 3
      
      arr = df.to_numpy()
      data = df.columns.to_numpy()[(~arr).argsort(axis=1, kind='stable')[:, :N]]
      mask = np.ones_like(data).cumsum(1) <= arr.sum(1)[:, None]
      
      res = pd.DataFrame(data, columns=[f'TrueVal{i+1}' for i in range(N)],
                         index=df.index).where(mask)
      

      print(res)
      
            TrueVal1 TrueVal2 TrueVal3
      index                           
      1         val1     val3     val4
      2         val2     val3     val5
      3         val4     val6      NaN
      4         val1     val2     val3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 2022-11-29
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多