pandas 如何基于一个id外部合并3个或更多的数据集,并使用一列比较它们?

gorkyyrv  于 2022-12-16  发布在  其他
关注(0)|答案(2)|浏览(101)

假设我们有三个不同年份的数据集:
| 识别号|正文|年份|
| - ------|- ------|- ------|
| 一百零一|美国广播公司|小行星1990|
| 一百零二|阿卜德|小行星1990|
| 一百零三|项目a|小行星1990|
第二个数据集可能包含(或不包含)第一年的ID:
| 识别号|正文|年份|
| - ------|- ------|- ------|
| 一百零四|公元前|小行星1991|
| 一百零一|美国广播公司|小行星1991|
| 一百零二|阿贝|小行星1991|
第三个数据集:
| 识别号|正文|年份|
| - ------|- ------|- ------|
| 一百零四|公元前|小行星1992|
| 一百零五|项目a|小行星1992|
我想以某种方式合并这三个 Dataframe +添加一个新列,以查看连续年份的通用ID(和非通用ID)之间的文本是否相同+如果我们注意到Year 1和Year 2的文本之间存在相似性,则更新年份。
下面是我想要的结果:
| 识别号|正文|年份|相似|
| - ------|- ------|- ------|- ------|
| 一百零一|美国广播公司|小行星1991|真|
| 一百零二|阿贝|小行星1991|假的|
| 一百零三|项目a|小行星1990|假的|
| 一百零四|公元前|小行星1992|真|
| 一百零五|项目a|小行星1992|假的|
所以我还想包含那些与新年相对应的新ID,但也要保留上一年的ID,但在ID +该类似列方面没有匹配。合并不应是内部的(因为我们还希望集成第二个/第三个 Dataframe 中不存在的那些ID),并且如果Similar列为真,则应更新年份(假设来自ID 104,1991年的文本与来自ID 104,1992年的文本相同)。
谢谢

f87krz0w

f87krz0w1#

对于列Similar,可以将groupby.agglambda g: g.nunique()!=len(g)(如果至少有一个非重复项)或lambda g: g.duplicated(keep=False).all()一起使用:

dfs = [df1, df2, df3]

out = (pd.concat(dfs)
         .groupby('ID', as_index=False)
         .agg(**{'Text': ('Text', 'last'),
                 'Year': ('Year', 'last'),
                 'Similar': ('Text', lambda g: g.duplicated(keep=False).all())
                })
      )

输出:

ID Text  Year  Similar
0  101  abc  1991     True
1  102  abe  1991    False
2  103    a  1990    False
3  104   bc  1992     True
4  105    a  1992    False
zu0ti5jz

zu0ti5jz2#

所以,我在这里第一次合并所有df使用Pandasconcat函数,在第二阶段分组id第三次应用lambda函数和过滤最后一个位置的-1
请尝试以下代码:

pd.concat([df1,df2,df3]).groupby('id').apply(lambda x: x.iloc[[-1]]).reset_index(drop=True)

相关问题