Как объединить несколько столбцов панд данных - PullRequest
0 голосов
/ 07 января 2019

У меня есть фрейм данных, аналогичный показанному ниже.

In[2]: df = pd.DataFrame({'P1': [1, 2, None, None, None, None],'P2': [None, None, 3, 4, None, None],'P3': [None, None, None, None, 5, 6]})
Out[2]: 
    P1   P2   P3
0  1.0  NaN  NaN
1  2.0  NaN  NaN
2  NaN  3.0  NaN
3  NaN  4.0  NaN
4  NaN  NaN  5.0
5  NaN  NaN  6.0

И я пытаюсь объединить все столбцы в один столбец P в новом фрейме данных (см. Ниже).

     P
0  1.0
1  2.0
2  3.0
3  4.0
4  5.0
5  6.0

В моем реальном коде у меня есть произвольный список столбцов, которые должны быть объединены, необязательно P1, P2 и P3 (между 1 и 5 столбцами). Я пробовал что-то вроде следующего:

new_series = pd.Series()
desired_columns = ['P1', 'P2', 'P3']
for col in desired_columns:
    other_series=df[col]
    new_series = new_series.align(other_series)

Однако это приводит к кортежу объектов Series, и ни один из них не содержит данных, которые мне нужны. Я мог бы пройтись по каждой строке, а затем проверить каждый столбец, но я чувствую, что, скорее всего, есть простое решение для панд, которое мне не хватает.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Другое альтернативное решение:

Таким образом, если мы не будем выбирать столбцы в пределах DataFrame, мы можем использовать функцию bfill () для заполнения значений non-nan в кадре данных по столбцам. Итак, когда axis='columns', то текущие ячейки nan будут заполняется из значения, присутствующего в следующем столбце в той же строке.

>>> df['P'] = df.bfill(axis=1).iloc[:, 0]
>>> df
    P1   P2   P3    P
0  1.0  NaN  NaN  1.0
1  2.0  NaN  NaN  2.0
2  NaN  3.0  NaN  3.0
3  NaN  4.0  NaN  4.0
4  NaN  NaN  5.0  5.0
5  NaN  NaN  6.0  6.0
0 голосов
/ 07 января 2019

Если в каждой строке вперед заполнено только одно значение None, None s и выберите последний столбец по позиции:

df['P'] = df[['P1', 'P2', 'P3']].ffill(axis=1).iloc[:, -1]
print (df)
    P1   P2   P3    P
0  1.0  NaN  NaN  1.0
1  2.0  NaN  NaN  2.0
2  NaN  3.0  NaN  3.0
3  NaN  4.0  NaN  4.0
4  NaN  NaN  5.0  5.0
5  NaN  NaN  6.0  6.0
...