python - 根据给定条件过滤数据框并添加新列
问题描述
我有一个这样的数据框
ID col1 col2
1 Abc street 2017-07-27
1 None 2017-08-17
1 Def street 2018-07-15
1 None 2018-08-13
2 fbg street 2018-01-07
2 None 2018-08-12
2 trf street 2019-01-15
我想过滤掉 col1 中的所有“无”,并将相应的 col2 值添加到新列 col3 中。我的输出看起来像这样
ID col1 col2 col3
1 Abc street 2017-07-27 2017-08-17
1 Def street 2018-07-15 2018-08-13
2 fbg street 2018-01-07 2018-08-12
2 trf street 2019-01-15
任何人都可以帮助我实现这一目标。
解决方案
今日版的 Over Engineered with Numpy
虽然公认的很少明显 Numpy
i, rows = pd.factorize([*zip(df.ID, df.col1.replace('None'))])
k, cols = pd.factorize(df.groupby(i).cumcount())
dleft = pd.DataFrame(dict(zip(['ID', 'col1'], zip(*rows))))
drigt = pd.DataFrame(index=dleft.index, columns=np.arange(len(cols)) + 2).add_prefix('col')
drigt.values[i, k] = df.col2.values
dleft.join(drigt)
ID col1 col2 col3
0 1 Abc street 2017-07-27 2017-08-17
1 1 Def street 2018-07-15 2018-08-13
2 2 fbg street 2018-01-07 2018-08-12
3 2 trf street 2019-01-15 NaN
推荐阅读
- mongodb - 从来自一个阶段的多个文档的组合创建一个新的输出 - 聚合框架
- http-live-streaming - MediaLive:流逝的时间
- reactjs - 如果我使用 Auth0 作为我的 React 应用程序的身份验证服务,我是否需要 passport.js?
- python - 解析标记的数据字符串,而不是纯字符串
- c - C中的字符串复制逻辑
- python - 直接执行脚本时出现 Python ModuleNotFoundError
- javascript - React,Nodejs 和 socket.io,将 socket.io 事件从 nodejs 发送到客户端(React)是在事件中提供数据 8 次
- python - 如何在 django 中配置我的静态文件?
- c# - 零对多关系 efcore
- recursion - DP - 爬楼梯的最低成本