请注意,我是一名初级程序员,也是一名初级 python/pandas 用户。我是一名行为科学家,正在学习使用 pandas 来处理和组织我的数据。因此,其中一些问题可能看起来完全显而易见,而且似乎是一个不值得论坛讨论的问题。请大家宽容!对我来说,这就是几天的工作,我确实已经花了几个小时试图找出这个问题的答案。预先感谢您的帮助。
我的数据如下所示。 “真实”参与者和接收者数据始终是 5 位数字,“行为”数据始终是字母代码。我的问题是,我也将这种格式用于特殊行,在“ Actor ”列中用“日期”或“s”等标记表示。这些标记指示“行为”列保存这种特殊类型的数据,而不是实际的行为数据。因此,我想用 NaN 值替换 Actor 列中的标记,并从行为列中获取特殊数据以放入另一列(在本例中为空的 Activity 列)。
follow Activity Actor Behavior Recipient1
0 1 NaN date 2.1.3.2012 NaN
1 1 NaN s ss.hx NaN
2 1 NaN 50505 vo 51608
3 1 NaN 51608 vr 50505
4 1 NaN s ss.he NaN
到目前为止,我已经在 pandas 中编写了一些代码,以将“s”行选择到新的数据帧中:
def get_act_line(group):
return group.ix[(group.Actor == 's')]
result = trimdata.groupby('follow').apply(get_act_line)
我已将此数据框中的“行为”列复制到“事件”列,并将 Actor 和行为值替换为 NaN:
result.Activity = result.Behavior
result.Behavior = np.nan
result.Actor = np.nan
result.head()
所以我的新数据框如下所示:
follow follow Activity Actor Behavior Recipient1
1 2 1 ss.hx NaN NaN NaN
34 1 hf.xa NaN NaN f.53702
74 1 hf.fe NaN NaN NaN
10 1287 10 ss.hf NaN NaN db
1335 10 fe NaN NaN db
我现在想做的就是将此数据帧与原始数据帧合并,替换这些选定行中的所有值,但保留原始数据帧中其他行的值。
这可能看起来是一个简单的问题,但有一个明显的解决方案,或者也许我一开始就搞错了!
我已经阅读了 Wes McKinney 的书,我阅读了有关不同类型的合并、映射、连接、转换、串联等的文档。我浏览了论坛,但没有找到可以帮助我理解的答案这个出来了。我们将非常感谢您的帮助。
最佳答案
实现此目的的一种方法(尽管可能有更优化或更优雅的方法)是:
mask = (df['Actor']=='s')
df['Activity'] = df[mask]['Behavior']
df.ix[mask, 'Behavior'] = np.nan
其中 df 相当于您的结果数据框。这应该返回(我的列顺序略有不同):
Activity Actor Behavior Recipient1 follow
0 NaN date 2013-04-01 00:00:00 NaN 1
1 ss.hx NaN ss.hx NaN 1
2 NaN 50505 vo 51608 1
3 NaN 51608 vr 50505 1
4 ss.he NaN ss.hx NaN 1
引用文献:
- df.ix 的解释来自其他 STO 帖子。
关于python - 组合两个数据帧中的两列;索引相同但长度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970643/