У меня есть датафрейм с n столбцами

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

И я хочу преобразовать n столбцов в один столбец как:

О / р :

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]

Но это перезаписывает ранее записанные данные. Так что, если я хочу, чтобы данные не перезаписывались и добавляю данные n столбцов в один столбец, используя панд

0
userD1989 2 Май 2019 в 11:25

4 ответа

Лучший ответ

Как вы сказали в комментарии, пустым является NaN, поэтому вам просто нужно T и bfill

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 на всякий случай, поэтому я использовал и ffill, и bfill. Если вам это не нужно, вы можете использовать ffill или bfill с разными iloc

df2.T.ffill().iloc[-1]
2
Andy L. 2 Май 2019 в 10:01

Вы можете просто использовать простую сумму по строкам:

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
1
theletz 2 Май 2019 в 10:45

Это может быть наименее эффективным способом сделать это, но он должен сделать работу:

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
0
Tabbakhh 2 Май 2019 в 09:07

Сначала преобразуйте пустые строки в NaN's, используя DataFrame.replace, а затем используйте 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
0
Sandeep Kadapa 2 Май 2019 в 09:13