使用pandas将三列数据转换为单列

时间:2019-05-02 08:25:41

标签: pandas

我有一个n列的数据框

col1     col2       col3
----------------------
val
val
NaN
val
val
        val1
        val1
        NaN
        val1
        val1
                   val2
                   val2
                   NaN
                   val2
                   val2

我想将n列转换为单列,如下:

o / p:

col4 
-----
val
val
NaN
val
val
val1
val1
NaN
val1
val1                           
val2
val2
NaN
val2
val2

我正在获取每一列数据,而当我分配数据时,它将覆盖数据。

for i in range(len(df)):
     col = df[i]
     df1['A']=df[col]

但是它会覆盖以前写入的数据。因此,如果我不希望数据被覆盖并使用pandas将n列数据添加到单列中

4 个答案:

答案 0 :(得分:2)

正如您在评论中说的,空白是NaN,因此您只需要Tbfill

df2.T.bfill().iloc[0]

Out[141]:
0      val
1      val
2      NaN
3      val
4      val
5     val1
6     val1
7      NaN
8     val1
9     val1
10    val2
11    val2
12     NaN
13    val2
14    val2
Name: col1, dtype: object

注意:最初,我为填补df而填写,以防万一,所以我同时使用了ffillbfill。如果不需要,可以将ffillbfill与其他iloc

一起使用
df2.T.ffill().iloc[-1]

答案 1 :(得分:1)

您可以在行上使用简单的总和:

import pandas as pd
import numpy as np
df=pd.DataFrame({'col1': [1, np.NaN,np.NaN,np.NaN,], 'col2': 
[np.NaN,2,np.NaN,np.NaN,], 'col3': [np.NaN,np.NaN,3,np.NaN,]})
df


    col1    col2    col3
0   1.0      NaN     NaN
1   NaN      2.0     NaN
2   NaN      NaN     3.0
3   NaN      NaN     NaN

现在您可以对行求和(通过使用axis = 1),我们希望NaN的总和为NaN,所以我们使用min_count = 1:

%%timeit
df['col4'] = df.sum(axis=1,min_count=1)

Out: 1000 loops, best of 3: 334 µs per loop

%%timeit
df.T.bfill().iloc[0]

Out: 1000 loops, best of 3: 524 µs per loop

答案 2 :(得分:0)

这可能是效率最低的方法,但是应该可以完成工作:

combined_col = [] 
     for i in range(len(df)): 
         col = df.iloc[i, :] 
         if col.isnull().sum() == len(df.columns): 
             combined_col.append(np.NAN) 
         else: 
             combined_col.append(col[~col.isnull()][0]) 

df['combined_col'] = combined_col

结果:

    col1  col2  col3  combined_col
0    1.0   NaN   NaN   1.0
1    2.0   NaN   NaN   2.0
2    NaN   NaN   NaN   NaN
3    3.0   NaN   NaN   3.0
4    4.0   NaN   NaN   4.0
5    NaN   7.0   NaN   7.0
6    NaN  13.0   NaN  13.0
7    NaN   NaN   NaN   NaN
8    NaN  22.0   NaN  22.0
9    NaN  16.0   NaN  16.0
10   NaN   NaN  12.0  12.0
11   NaN   NaN  32.0  32.0
12   NaN   NaN   NaN   NaN
13   NaN   NaN   1.0   1.0
14   NaN   NaN   6.0   6.0

答案 3 :(得分:0)

首先,使用DataFrame.replace将空字符串转换为NaN's,然后将DataFrame.ffill用作:

df = df.replace({' ':np.nan}).ffill(1)['col3'].to_frame(name='col4')

print(df)
    col4
0    val
1    val
2    NaN
3    val
4    val
5   val1
6   val1
7    NaN
8   val1
9   val1
10  val2
11  val2
12   NaN
13  val2
14  val2