gpt4 book ai didi

python - 连接Python数据帧,删除重复项并保留行起源记录

转载 作者:行者123 更新时间:2023-12-02 08:10:04 38 4
gpt4 key购买 nike

我有多个数据框,示例数据:

df1:

user_id    username firstname lastname 
123 abc abc abc
456 def def def
789 ghi ghi ghi

df2:

user_id     username  firstname lastname
111 xyz xyz xyz
456 def def def
234 mnp mnp mnp

df3:

user_id     username  firstname lastname
789 ghi ghi ghi
456 def def def
222 uwv uwv uwv

我想连接这些数据帧,删除重复的行,并通过添加更多列来跟踪行的起源。期望的输出:

df1:

user_id    username firstname lastname df1 df2 df3
123 abc abc abc 1 0 0
456 def def def 1 1 1
789 ghi ghi ghi 1 0 1
111 xyz xyz xyz 0 1 0
234 mnp mnp mnp 0 1 0
222 uwv uwv uwv 0 0 1

我可以使用以下方法连接第一步:

pd.concat([df1, df2, df3]).drop_duplicates('user_id').reset_index(drop=True)

我该如何完成最后一步(制作原始列)?我不知道如何在没有 forloop 的情况下做到这一点,这对于大数据框来说不实用。谢谢

最佳答案

由于您在连接后需要 df 名称的详细信息,因此不应删除它们。

您需要将df名称添加为一列,以便连接后我们可以知道哪一行来自哪df

>>> cols = df1.columns.to_list() # Store columns before adding `origin` column to use later in groupby
>>> df1['origin'] = 'df1'
>>> df2['origin'] = 'df2'
>>> df3['origin'] = 'df3'

现在,使用 groupby 您的任务变得很容易。

>>> df = pd.concat([df1, df2, df3])\
.reset_index(drop=True)\
.groupby(by = cols, axis=0)\
.apply(lambda x: x['origin'].values)\
.to_frame('origin')\
.reset_index()
<小时/>

输出:

>>> df

user_id username firstname lastname origin
0 111 xyz xyz xyz [df2]
1 123 abc abc abc [df1]
2 222 uwv uwv uwv [df3]
3 234 mnp mnp mnp [df2]
4 456 def def def [df1, df2, df3]
5 789 ghi ghi ghi [df1, df3]

您需要进行一次热编码才能获得预期结果,例如(引用自 here )

使用sklearn.preprocessing.MultiLabelBinarizer(您也可以使用pd.get_dummies,请检查this)

>>> from sklearn.preprocessing import MultiLabelBinarizer
>>> mlb = MultiLabelBinarizer()
>>> expandedLabelData = mlb.fit_transform(df["origin"])
>>> labelClasses = mlb.classes_
>>> encoded_df = pd.DataFrame(expandedLabelData, columns=labelClasses)
df1 df2 df3
0 0 1 0
1 1 0 0
2 0 0 1
3 0 1 0
4 1 1 1
5 1 0 1

最后,

>>> pd.concat([df.drop('origin', axis=1), encoded_df], axis=1)
user_id username firstname lastname df1 df2 df3
0 111 xyz xyz xyz 0 1 0
1 123 abc abc abc 1 0 0
2 222 uwv uwv uwv 0 0 1
3 234 mnp mnp mnp 0 1 0
4 456 def def def 1 1 1
5 789 ghi ghi ghi 1 0 1

关于python - 连接Python数据帧,删除重复项并保留行起源记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60482674/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com