【问题标题】:Return pandas data frame with certain value "1"返回具有特定值“1”的熊猫数据框
【发布时间】:2018-03-04 08:23:10
【问题描述】:

我正在寻找最简单直接的方法来返回值为“1”的数据框或列名列表。

假设我从这个开始:

import pandas as pd 

dates = pd.date_range('1/1/2017', periods=4, freq='D')
df = pd.DataFrame({'W01': [0, 0, 0, 1], 'W02': [0, 1, 0, 0], 'W03': [0, 0, 0, 1]
              },
             index = dates)

df

           W01  W02 W03
2017-01-01  0   0   0
2017-01-02  0   1   0
2017-01-03  0   0   0
2017-01-04  1   0   1

我想要一个像这样结束的数据框。或者另一种更智能的方式对值为“1”的列进行分组。

           Value  X1    X2  
2017-01-01  1     NaN   NaN     
2017-01-02  1     W02   NaN
2017-01-03  1     NaN   NaN
2017-01-04  1     W01   W03

或者,解决方案可以返回这样的列表?

2017-01-01, NaN
2017-01-02, W02
2017-01-03, NaN
2017-01-04, W01, W03

我的实际数据框有 85 列和近 700 行。所以解决方案应该能够匹配这些维度。

pandas 中的 get_value 函数似乎还可以,但我想不通:df.get_value(dates, col="1")

或者,我可以使用 lambda,但它不能提供我正在寻找的所有信息。 df.select(lambda x: x == '1', axis=1)

帮助?

【问题讨论】:

标签: python pandas search dataframe lambda


【解决方案1】:

设置

df1=df.reset_index().melt('index')
df1=df1[df1.value.eq(1)]

1

df1.groupby('index')['variable'].apply(lambda x : ','.join(x)).to_frame().reindex(df.index)

Out[846]: 
           variable
2017-01-01      NaN
2017-01-02      W02
2017-01-03      NaN
2017-01-04  W01,W03

2

df1.groupby('index')['variable'].apply(lambda x : list(x)).apply(pd.Series).reindex(df.index)
Out[852]: 
              0    1
2017-01-01  NaN  NaN
2017-01-02  W02  NaN
2017-01-03  NaN  NaN
2017-01-04  W01  W03

【讨论】:

    【解决方案2】:

    你可以

    In [2784]: (df.apply(lambda x: ', '.join(x.index[x.astype(bool)]), axis=1)
                  .replace('', np.nan))
    Out[2784]:
    2017-01-01         NaN
    2017-01-02         W02
    2017-01-03         NaN
    2017-01-04    W01, W03
    Freq: D, dtype: object
    

    或者,

    In [2787]: df.apply(lambda x: pd.Series(x.index[x.astype(bool)]), axis=1)
    Out[2787]:
                  0    1
    2017-01-01  NaN  NaN
    2017-01-02  W02  NaN
    2017-01-03  NaN  NaN
    2017-01-04  W01  W03
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-17
      • 2019-11-12
      • 2015-03-29
      • 2022-07-22
      • 2021-06-28
      • 2018-04-03
      • 2021-01-01
      • 2018-05-13
      相关资源
      最近更新 更多