合并连续匹配的行

时间:2019-02-25 20:16:34

标签: python pandas

我想通过匹配所有'X'字段并串联'Y'字段来合并所有连续的行。

下面是示例数据-

[Y  X1  X2  X3  X4  X5
A   NaN -3810   TRUE    None    None
B   NaN -3810   TRUE    None    None
C   NaN -3810   TRUE    None    None
D   NaN -3810   None    None    None
E   NaN -3810   None    None    None
F   NaN -3810   None    None    None
G   NaN -3810   None    None    None
H   NaN -3810   TRUE    None    None
I   NaN  2540   TRUE    None    None
J   NaN  2540   None    True    None]

1

预期输出-

[A B C  NaN -3810   TRUE    None    None
D E F G NaN -3810   None    None    None
H       NaN -3810   TRUE    None    None
I       NaN  2540   TRUE    None    None
J       NaN  2540   None    True    None]

2

如前所述,如果X字段的任何连续行更改,则它们不应串联。 预先感谢。

2 个答案:

答案 0 :(得分:3)

有点棘手,使用shift创建groupkey,然后使用agg

df.fillna('NaN',inplace=True) # notice here NaN always no equal to NaN, so I replace it with string 'NaN'
df.groupby((df.drop('Y',1)!=df.drop('Y',1).shift()).any(1).cumsum()).\
     agg(lambda x : ','.join(x) if x.name=='Y' else x.iloc[0])
Out[19]: 
         Y   X1    X2    X3    X4    X5
1    A,B,C  NaN -3810  TRUE  None  None
2  D,E,F,G  NaN -3810  None  None  None
3        H  NaN -3810  TRUE  None  None

答案 1 :(得分:2)

itertools.groupby

请记住,itertools.groupby对我们来说具有建设性。

from itertools import groupby

Y = df.Y
X = df.filter(like='X').T  # df.drop('Y', 1).T
K = lambda x: (*X[x].fillna('NA'),)

tups = [
    (' '.join(Y.loc[V]), *X[V[0]])
    for _, [*V] in groupby(Y.index, key=K)
]

pd.DataFrame(tups, columns=df.columns)

         Y  X1    X2    X3    X4    X5
0    A B C NaN -3810  TRUE  None  None
1  D E F G NaN -3810  None  None  None
2        H NaN -3810  TRUE  None  None
3        I NaN  2540  TRUE  None  None
4        J NaN  2540  None  True  None