作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有多个数据框,示例数据:
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/
我是一名优秀的程序员,十分优秀!