请注意,我是初学程序员和初级python / pandas用户。我是一名行为科学家,学习使用熊猫来处理和整理我的数据。因此,其中一些可能看起来非常明显,这似乎是一个不值得论坛的问题。请宽容!对我来说,这是几天的工作,我确实花了好几个小时试图找出这个问题的答案。提前感谢您的帮助。
我的数据看起来像这样。 “真正的”Actor和收件人数据始终是5位数字,“行为”数据始终是字母代码。我的问题是我也将此格式用于特殊行,在Actor列中用“date”或“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)
我已将此数据框中的Behavior列复制到Activity列,并用NaN替换了Actor和Behavior值:
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的书,我已经阅读了关于不同类型的合并,映射,加入,转换,连接等的文档。我浏览了论坛并且没有找到帮助我解决问题的答案这个。非常感谢您的帮助。
答案 0 :(得分:2)
您可以采用的一种方式(尽管可能有更优化或更优雅的方式):
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
参考文献: