Соедините строки из того же столбца в «pandas», используя условие заполнителя - PullRequest
0 голосов
/ 02 мая 2018

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

Я хотел бы объединить все строки, которые встречаются до каждого NaN в новом столбце.

Например, мои данные выглядят примерно так:

the
car
is
red
NaN
the
house
is
big
NaN
the
room
is
small

Мой желаемый результат -

B
the car is red
the house is big
the room is small

Пока что я подхожу к этой проблеме, создав функцию и применив ее к каждой строке в моем фрейме данных. Ниже приведен пример моего рабочего кода.

def joinNan(row):
    newRow = []
    placeholder = 'NaN'
    if row is not placeholder:
        newRow.append(row)
    if row == placeholder:
        return newRow


df['B'] = df.loc[0].apply(joinNan)

По какой-то причине первая строка моих данных используется в качестве индекса или заголовка столбца, поэтому я использую здесь «loc [0]» вместо определенного имени столбца.

Если есть более прямой способ приблизиться к этой прямой итерации в столбце, я открыт для этого предложения.

На данный момент я пытаюсь найти желаемое решение и не нашел другого подобного случая в переполнении стека или в Интернете в целом, чтобы помочь мне.

1 Ответ

0 голосов
/ 02 мая 2018

Я думаю, что для теста NaN s необходимо использовать isna, затем Greate Helper Series по cumsum и агрегировать join с groupby:

df=df.groupby(df[0].isna().cumsum())[0].apply(lambda x: ' '.join(x.dropna())).to_frame('B')
#for oldier version of pandas
df=df.groupby(df[0].isnull().cumsum())[0].apply(lambda x: ' '.join(x.dropna())).to_frame('B')

Другое решение - отфильтровать все NaN с до groupby:

mask = df[0].isna()
#mask = df[0].isnull()
df['g'] = mask.cumsum()

df = df[~mask].groupby('g')[0].apply(' '.join).to_frame('B')
...