将名称不同的列合并为一列,以填充NaN

时间:2018-11-22 10:00:56

标签: python-3.x pandas

请问有关此事的帮助?什么是执行此任务的最pythonic或最简单的方法?我认为这可以通过熔化或堆叠来完成,但是我无法做到。非常感谢您的帮助。非常感谢。

data = [['1',np.nan,np.nan],['2',np.nan,np.nan],[np.nan,'3',np.nan],
        [np.nan,'3',np.nan],[np.nan,'3',np.nan],[np.nan,np.nan,'15'],[np.nan,np.nan,'15']]
df = pd.DataFrame(data,columns=['no','number', 'numbers'])
df
  no number numbers
0    1    NaN     NaN
1    2    NaN     NaN
2  NaN      3     NaN
3  NaN      3     NaN
4  NaN      3     NaN
5  NaN    NaN      15
6  NaN    NaN      15

Result = [['1'],['2'],['3'],['3'],['3'],['15'],['15']]
Expected = pd.DataFrame(Result, columns = ['NUMBER'])
Expected
 NUMBER
0      1
1      2
2      3
3      3
4      3
5     15
6     15

1 个答案:

答案 0 :(得分:1)

stackreset_index一起使用,并将Series转换为一列DataFrame函数to_frame

df = df.stack().reset_index(drop=True).to_frame('NUMBER')
print (df)
  NUMBER
0      1
1      2
2      3
3      3
4      3
5     15
6     15

编辑:

data = [['1','100',np.nan],['2',np.nan,np.nan],[np.nan,'3',np.nan],
        [np.nan,'3',np.nan],[np.nan,'3',np.nan],[np.nan,np.nan,'15'],
        [np.nan,np.nan,'15']]
df = pd.DataFrame(data,columns=['no','number', 'numbers'])
print (df)
    no number numbers
0    1    100     NaN
1    2    NaN     NaN
2  NaN      3     NaN
3  NaN      3     NaN
4  NaN      3     NaN
5  NaN    NaN      15
6  NaN    NaN      15

如果要每行第一个非数字值:

df1 = df.bfill(axis=1).iloc[:, 0].to_frame('NUMBER')
print (df1)
  NUMBER
0      1
1      2
2      3
3      3
4      3
5     15
6     15

如果需要所有非数值:

df2 = df.stack().reset_index(drop=True).to_frame('NUMBER')
print (df2)
  NUMBER
0      1
1    100
2      2
3      3
4      3
5      3
6     15
7     15
相关问题