我希望选择并合并与其他两列具有相同值的行(如SQL中的主键)。我应该使用什么函数?
我尝试过使用df.duplicate(subset=...),但似乎没有给出正确的结果。
例如,我想合并'col‘和'col’的值相同的行。
所以这个df就会变成
col a 'col B' col c 'col D' col e
''''''''''''''''''''''''''''''''''''''''''''''''''''''
0 a ABC-1 nan ABCD b,c
1 a ABC-2 nan ABCD aaa
2 b ABC-1 c ABCD b,c
3 c ABC-1 a,b ABCD b,c,d
4 nan ABC-3 c AACE b,c这
col a 'col B' col c 'col D' col e
''''''''''''''''''''''''''''''''''''''''''''''''''''
0 a,c ABC-1 a,b,c ABCD b,c,d
1 a ABC-2 nan ABCD aaa
2 nan ABC-3 c AACE b,c提前感谢
发布于 2019-05-08 14:00:10
如果顺序不重要拆分没有NaN的值,则在GroupBy.agg的自定义函数中转换为sets和join
def f(x):
out = set([z for y in x.dropna() for z in y.split(',')])
return ','.join(out) if bool(out) else np.nan
df = df.groupby(['col B','col D']).agg(f).reset_index().reindex(columns=df.columns)
print (df)
col a col B col c col D col e
0 c,a,b ABC-1 a,c,b ABCD c,b,d
1 a ABC-2 NaN ABCD aaa
2 NaN ABC-3 c AACE c,b如果顺序很重要,请使用OrderedDict
from collections import OrderedDict
def f(x):
out = OrderedDict.fromkeys([z for y in x.dropna() for z in y.split(',')]).keys()
return ','.join(out) if bool(out) else np.nan
df = df.groupby(['col B','col D']).agg(f).reset_index().reindex(columns=df.columns)
print (df)
col a col B col c col D col e
0 a,b,c ABC-1 c,a,b ABCD b,c,d
1 a ABC-2 NaN ABCD aaa
2 NaN ABC-3 c AACE b,c发布于 2019-05-08 15:03:33
你也可以看看下面的解决方案。
groups = df.groupby(['b','d'])
def reduce_values(dataframe):
vals = []
# print(dataframe.columns)
for i in dataframe.columns:
if dataframe[i].dropna().count():
vals.append(','.join(set(dataframe[i].dropna().str.split(',').sum())))
else:
vals.append(dataframe[i][dataframe[i].index[-1]])
return vals
# ndf
ndf = groups.apply(lambda x: pd.DataFrame([reduce_values(x)],columns=[i for i in x.columns if i not in groups.size().index.names])).reset_index(level=2,drop=True)
print(ndf)https://stackoverflow.com/questions/56034300
复制相似问题