【问题标题】:pandas : columns sample based on row valuepandas:基于行值的列样本
【发布时间】:2018-01-29 14:17:48
【问题描述】:

例如我有这个数据框:

 d = {'data_1' : pd.Series([1., 2., 3., 4., 1], index=['a', 'b', 'c', 'd', 'class']),
  'data_2' : pd.Series([5., 6., 7., 8., 0], index=['a', 'b', 'c', 'd', 'class']),
  'data_3' : pd.Series([9., 10., 11., 12., 1], index=['a', 'b', 'c', 'd', 'class'])}
df = pd.DataFrame(d)

所以我得到的输出:

    data_1  data_2  data_3
a   1.0      5.0    9.0
b   2.0      6.0    10.0
c   3.0      7.0    11.0
cls 1.0      0.0    1.0

我想做的是根据“cls”行中报告的值创建一个过滤器,并根据两个可能的类将数据框一分为二

    data_1  data_3
a   1.0      9.0
b   2.0      10.0
c   3.0      11.0
cls 1.0      1.0

        data_2
a        5.0
b        6.0    
c        7.0    
cls      0.0    

【问题讨论】:

    标签: python pandas dataframe filter split


    【解决方案1】:

    boolean indexingloc 一起使用 - 第一个用于按条件选择所有列,第二个用于按index 选择行:

    df1 = df.loc[:, df.loc['class'] == 1]
    df2 = df.loc[:, df.loc['class'] == 0]
    

    也可以通过行class的所有唯一值创建字典:

    s = df.loc['class']
    dfs = {k:df[v.index] for k, v in s.groupby(s)}
    print (dfs)
    
    {0.0:        data_2
    a         5.0
    b         6.0
    c         7.0
    d         8.0
    class     0.0, 1.0:        data_1  data_3
    a         1.0     9.0
    b         2.0    10.0
    c         3.0    11.0
    d         4.0    12.0
    class     1.0     1.0}
    

    print (list(dfs.keys()))
    [0.0, 1.0]
    
    print (dfs[0])
           data_2
    a         5.0
    b         6.0
    c         7.0
    d         8.0
    class     0.0:
    
    print (dfs[1])
           data_1  data_3
    a         1.0     9.0
    b         2.0    10.0
    c         3.0    11.0
    d         4.0    12.0
    class     1.0     1.0
    

    【讨论】:

      【解决方案2】:

      动态进行

      In [889]: s = df.loc['class']
      
      In [890]: dfs = {k: df[s[s==v].index] for k, v in  enumerate(s.unique())}
      
      # or dfs = {v: df[s[s==v].index] for v in s.unique()} -- for value based keys
      
      In [891]: dfs[0]
      Out[891]:
             data_1  data_3
      a         1.0     9.0
      b         2.0    10.0
      c         3.0    11.0
      d         4.0    12.0
      class     1.0     1.0
      
      In [892]: dfs[1]
      Out[892]:
             data_2
      a         5.0
      b         6.0
      c         7.0
      d         8.0
      class     0.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 2021-11-19
        相关资源
        最近更新 更多