python - 如何将 Pandas DataFrame 与列表的字典合并
问题描述
合并df
这样的最佳方法是什么:
+------------+----------+
| domain | username |
+------------+----------+
| @gmail.com | gagaga |
+------------+----------+
| @mail.com | bobo |
+------------+----------+
像这样的字典:
domain_to_app = {
'@gmail.com': ['gmail', 'youtube', 'gdrive'],
'@mail.com': ['email', 'dropbox']
}
得到这个:
+------------+----------+-----------+
| domain | username | app |
+------------+----------+-----------+
| @gmail.com | gagaga | gmail |
+------------+----------+-----------+
| @gmail.com | gagaga | youtube |
+------------+----------+-----------+
| @gmail.com | gagaga | gdrive |
+------------+----------+-----------+
| @mail.com | bobo | email |
+------------+----------+-----------+
| @mail.com | bobo | dropbox |
+------------+----------+-----------+
是否建议将其转换dict
为df
重复行并使用merge
,或者我应该使用map
然后取消堆叠应用程序列?
解决方案
您可以使用map
for new Series
,然后chain.from_iterable
使用repeat
for new DataFrame
:
s = df['domain'].map(domain_to_app)
from itertools import chain
lens = s.str.len()
df = pd.DataFrame({
'domain' : df['domain'].values.repeat(lens),
'username' : df['username'].values.repeat(lens),
'app' : list(chain.from_iterable(s))
})
print (df)
domain username app
0 @gmail.com gagaga gmail
1 @gmail.com gagaga youtube
2 @gmail.com gagaga gdrive
3 @mail.com bobo email
4 @mail.com bobo dropbox
如果需要重复DaatFrame
从mapped
值创建的多个列,请通过以下方式重塑stack
和“重复” join
:
df['app'] = df['domain'].map(domain_to_app)
df = (df.join(pd.DataFrame(df.pop('app')
.values.tolist())
.stack()
.reset_index(level=1, drop=True)
.rename('app'))).reset_index(drop=True)
print (df)
domain username app
0 @gmail.com gagaga gmail
1 @gmail.com gagaga youtube
2 @gmail.com gagaga gdrive
3 @mail.com bobo email
4 @mail.com bobo dropbox
推荐阅读
- android - 我在 android studio 模拟器中运行的应用程序没有加载 localhost 数据库内容
- signalr-hub - 将复杂对象从 signalR .NET Core 3.0 集线器发送到 clientIn
- sql - 我可以在子查询中使用“LIKE”吗
- reactjs - React:按属性值获取标签列表
- git - git checkout 并仅更新不同的子模块
- java - 如何创建像碧玉报告这样的嵌套表?
- javascript - 在 react-select Async 中设置值而不添加额外状态
- javascript - 验证行并突出显示 slickGrid 中的无效单元格
- java - 如何按(AKQJT)的降序排列扑克牌字母?
- sql - 如何在 Oracle 数据库中设置 max_string_size='EXTENDED'?