我想通过匹配所有'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]
预期输出-
[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]
如前所述,如果X字段的任何连续行更改,则它们不应串联。 预先感谢。
答案 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