我有一系列需要过滤的数据。 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溢出或网络中找不到任何其他类似的案例来帮助我。
答案 0 :(得分:0)
我认为测试NaN
必须使用isna
,然后通过cumsum
更新帮助Series
并将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')