使用条件熊猫将列连接为一列

时间:2019-05-17 13:34:39

标签: python pandas

我想连接数据集的所有列:

df = pd.DataFrame([['0987', 4, 'j'], ['9', 4, 'y'], ['9', 6, 't'], ['4', '', 'o'], ['', 9, 'o']],
                  columns=['col_a', 'col_b', 'col_c'])


In [1]:

  col_a col_b col_c
0  0987     4     j
1     9     4     y
2     9     6     t
3     4           u
4           9     o

加入条件的一栏。第一个是必须删除所有空或空条目,或者不将其添加到新集中。第二个是,如果新列(col_new)中的条目来自col_a或col_c,则它的标签必须为1。否则,它的标签必须为0。

所以我希望结果看起来像这样:

col_new label
0  0987     1
1     9     1
2     9     1
3     4     1
4     4     0
5     4     0
6     6     0
7     9     0
8     j     1
9     y     1 
10    t     1
11    u     1
12    o     1

1 个答案:

答案 0 :(得分:3)

使用DataFrame.melt,对于新标签列,也使用带有lambda函数的rename和最后DataFrame.query的筛选器行:

df = (df.rename(columns = lambda x: 1 if x in ['col_a','col_c'] else 0)
        .melt(var_name='label', value_name='col_new')
        .query('col_new != ""')[['col_new','label']])
print (df)

   col_new  label
0     0987      1
1        9      1
2        9      1
3        4      1
5        4      0
6        4      0
7        6      0
9        9      0
10       j      1
11       y      1
12       t      1
13       o      1
14       o      1

如果缺少值:

df = pd.DataFrame([['0987', 4, 'j'], ['9', 4, 'y'], ['9', 6, 't'], 
                   ['4', np.nan, 'o'], [np.nan, 9, 'o']],
                  columns=['col_a', 'col_b', 'col_c'])


df = (df.rename(columns= lambda x: 1 if x in ['col_a','col_c'] else 0)
        .melt(var_name='label', value_name='col_new')
        .query('col_new == col_new')[['col_new','label']])

或使用DataFrame.dropna进行过滤:

df = (df.rename(columns= lambda x: 1 if x in ['col_a','col_c'] else 0)
        .melt(var_name='label', value_name='col_new')[['col_new','label']])

df = df.dropna(subset=['col_new'])

print (df)

   col_new  label
0     0987      1
1        9      1
2        9      1
3        4      1
5        4      0
6        4      0
7        6      0
9        9      0
10       j      1
11       y      1
12       t      1
13       o      1
14       o      1