使用占位符条件

时间:2018-05-02 13:40:00

标签: python-2.7 pandas function dataframe apply

我有一系列需要过滤的数据。 df由一个col组成。由具有值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]'而不是特定的列名称。

如果有一种更直接的方法来直接在列中进行迭代,我也对这个建议持开放态度。

目前,我正在尝试达到我想要的解决方案,并且在Stack溢出或网络中找不到任何其他类似的案例来帮助我。

1 个答案:

答案 0 :(得分:0)

我认为测试NaN必须使用isna,然后通过cumsum更新帮助Series并将joingroupby汇总:

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')