2015-10-02 3 views
2

Существует Пандас DataFrame с 4-мя колоннами:Создать новую колонку, используя непустое значение из каждой строки

 col1 col2 col3 col4 
0 orange  NaN NaN  NaN 
1  NaN tomato NaN  NaN 
2  NaN  NaN apple  NaN 
3  NaN  NaN NaN carrot 
4  NaN potato NaN  NaN 

Каждая строка содержит только одно строковое значение, которое может присутствовать в любом столбце. Другими столбцами в этой строке являются NaN. Я хочу создать один столбец, который содержит строковые значения:

 col5 
0 orange 
1 tomato 
2 apple 
3 carrot 
4 potato 

Наиболее очевидный подход выглядит следующим образом:

data['col5'] = data.col1.astype(str) + data.col2.astype(str)... 

и удалить «NaN» из выходных строк, но это грязно и, безусловно, приведет к ошибки.

Предлагает ли Pandas простой способ сделать это?

ответ

1

Вот один из способов, с apply и first_valid_index:

In [11]: df.apply(lambda x: x[x.first_valid_index()], axis=1) 
Out[11]: 
0 orange 
1 tomato 
2  apple 
3 carrot 
4 potato 
dtype: object 

Для того, чтобы получить эти эффективно вы могли бы упасть до NumPy:

In [21]: df.values.ravel()[np.arange(0, len(df.index) * len(df.columns), len(df.columns)) + np.argmax(df.notnull().values, axis=1)] 
Out[21]: array(['orange', 'tomato', 'apple', 'carrot', 'potato'], dtype=object) 

Примечание: как не сработает, если у вас есть строки всех NaN, вы должны отфильтровать их (например, с dropna).

0

Сопоставление функции фильтра по элементам строк должно это сделать.

data['new_col'] = list(data.apply(lambda row: filter(lambda elem: not pd.isnull(elem), row)[0])) 
1

Другой способ (в предположении, что каждый столбец содержит одно значение строки, а остальные являются NaN, не "NaN") было бы, чтобы fillna, а затем использовать max:

>>> df.fillna('').max(axis=1) 
0 orange 
1 tomato 
2  apple 
3 carrot 
4 potato 
dtype: object 
Смежные вопросы