【问题标题】:Boolean values to column names in one list, dataframe pandas python一个列表中列名的布尔值,dataframe pandas python
【发布时间】:2018-03-27 01:31:26
【问题描述】:

我有一个这样的数据框

     A    B    C    D    E
  0  0.0  1.0  0.0  0.0  1.0
  1  0.0  0.0  1.0  0.0  0.0
  2  0.0  1.0  1.0  1.0  0.0
  3  1.0  0.0  0.0  0.0  1.0
  4  0.0  0.0  0.0  1.0  0.0

任务是得到这样的列表

0  B,E
1  C
2  B,C,D
3  A,E
4  D

任何想法,在此先感谢。

【问题讨论】:

标签: python list pandas dataframe


【解决方案1】:

您可以使用applyaxis=1 进行按行处理,然后将每一行与1 进行比较以获得索引值(因为axis=1 每行都转换为具有列索引的Series),它们由,:

s1 = df.apply(lambda x: ','.join(x.index[x == 1]), axis=1)
print (s1)
0      B,E
1        C
2    B,C,D
3      A,E
4        D
dtype: object

另一种解决方案,如果更大DataFrame,则更快。

首先将列格式更改为列表:

print (['{}, '.format(x) for x in df.columns])
['A, ', 'B, ', 'C, ', 'D, ', 'E, ']

类似:

s = np.where(df == 1, ['{}, '.format(x) for x in df.columns], '')

因为1 值被转换为Trues。比较 DataFrameTrues 的值,使用列名的自定义格式:

s = np.where(df, ['{}, '.format(x) for x in df.columns], '')
print (s)
[['' 'B, ' '' '' 'E, ']
 ['' '' 'C, ' '' '']
 ['' 'B, ' 'C, ' 'D, ' '']
 ['A, ' '' '' '' 'E, ']
 ['' '' '' 'D, ' '']]

最后加入所有行并删除空值:

s1 = pd.Series([''.join(x).strip(', ') for x in s], index=df.index)
print (s1)
0       B, E
1          C
2    B, C, D
3       A, E
4          D
dtype: object

编辑:旧答案另一个更好的解决方案:

s1 = df.eq(1).dot(df.columns + ',').str.rstrip(',')

【讨论】:

  • 很好的答案!,非常感谢 :)
猜你喜欢
  • 2015-05-30
  • 2018-11-25
  • 1970-01-01
  • 2020-09-26
  • 2014-01-30
  • 2018-01-07
  • 1970-01-01
  • 2012-04-08
  • 2018-04-28
相关资源
最近更新 更多