【问题标题】:Pandas DataFrame: How to convert numeric columns into pairwise categorical data?Pandas DataFrame:如何将数值列转换为成对分类数据?
【发布时间】:2019-03-20 09:39:17
【问题描述】:

给定一个 pandas 数据帧,如何将几个数值列(其中 x≠1 表示值存在,x=0 表示不存在)转换为成对的分类数据帧?我知道它类似于 one-hot 解码,但列并不完全是 one-hot。

一个例子:

 df
id A  B  C  D
0  3  0  0  1
1  4  1  0  0
2  1  7  20 0
3  0  0  0  4
4  0  0  0  0
5  0  1  0  0

结果将是: df 身份证匹配

 result 
0  A
0  D 
1  A
1  B
2  A
2  B
2  C
3  D
5  B

【问题讨论】:

标签: python pandas dataframe binary dummy-variable


【解决方案1】:

使用DataFrame.stack 进行过滤和Index.to_frame

s = df.stack()

df = s[s!=0].index.to_frame(index=False).rename(columns={1:'result'})
print (df)
   id result
0   0      A
1   0      D
2   1      A
3   1      B
4   2      A
5   2      B
6   2      C
7   3      D
8   5      B

或者,如果性能很重要,请使用 numpy.where 使用 DataFrame 构造函数通过匹配值进行索引:

i, c = np.where(df != 0)

df = pd.DataFrame({'id':df.index.values[i],
                   'result':df.columns.values[c]})
print (df)
   id result
0   0      A
1   0      D
2   1      A
3   1      B
4   2      A
5   2      B
6   2      C
7   3      D
8   5      B

编辑:

首先:

s = df.stack()

df = s[s!=0].reset_index()
df.columns= ['id','result','vals']
print (df)
   id result  vals
0   0      A     3
1   0      D     1
2   1      A     4
3   1      B     1
4   2      A     1
5   2      B     7
6   2      C    20
7   3      D     4
8   5      B     1

第二个:

df = pd.DataFrame({'id':df.index.values[i],
                   'result':df.columns.values[c],
                   'vals':df.values[i,c]})

【讨论】:

  • 谢谢!您知道将值本身添加到额外的列中吗?
  • @Codevan - 当然,等一下。
  • 'value':df_train.iloc[i,c] 结果df会有所帮助
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2017-09-08
  • 2019-11-17
  • 2020-07-08
  • 2018-07-23
  • 2021-02-23
  • 1970-01-01
  • 2020-05-28
相关资源
最近更新 更多