2017-09-22 29 views
1

我正在寻找最简单直接的方式来返回数据框或具有值“1”的列名称列表。返回某个值为“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行。所以解决方案应该能够匹配这些尺寸。

从大熊猫的get_value功能似乎不错,但我无法弄清楚:df.get_value(dates, col="1")

我也可以使用拉姆达,但它并没有提供所有我正在寻找的信息。 df.select(lambda x: x == '1', axis=1)

帮助?

+0

你试过['df.dot(df.columns + “ ”).str.strip(“”)'](https://stackoverflow.com/questions/46242976/elegant-方式对农产品-描述-的柱基柱头数据/ 46243057#46243057)? – Psidom

回答

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 
1

设立

df1=df.reset_index().melt('index') 
df1=df1[df1.value.eq(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 
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