我想连接数据集的所有列:
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
答案 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