Python 组合来自两个数据帧的两列;相同的指数但不同的长度

Python 组合来自两个数据帧的两列;相同的指数但不同的长度,python,merge,pandas,dataframe,Python,Merge,Pandas,Dataframe,请注意,我是一名初级程序员和初级python/pandas用户。我是一名行为科学家,正在学习使用熊猫来处理和组织我的数据。因此,其中一些问题可能看起来非常明显,似乎不值得在论坛上讨论。请宽容!对我来说,这是几天的工作,我确实已经花了几个小时试图找出这个问题的答案。提前感谢您的帮助 我的数据是这样的。“真实”参与者和接收者数据始终是5位数字,“行为”数据始终是字母代码。我的问题是,我还将这种格式用于特殊行,在Actor列中用诸如“date”或“s”之类的标记表示。这些标记表示“行为”列包含这种特殊

请注意,我是一名初级程序员和初级python/pandas用户。我是一名行为科学家,正在学习使用熊猫来处理和组织我的数据。因此,其中一些问题可能看起来非常明显,似乎不值得在论坛上讨论。请宽容!对我来说,这是几天的工作,我确实已经花了几个小时试图找出这个问题的答案。提前感谢您的帮助

我的数据是这样的。“真实”参与者和接收者数据始终是5位数字,“行为”数据始终是字母代码。我的问题是,我还将这种格式用于特殊行,在Actor列中用诸如“date”或“s”之类的标记表示。这些标记表示“行为”列包含这种特殊类型的数据,而不是实际的行为数据。因此,我想用NaN值替换Actor列中的标记,并从behavior列中获取特殊数据以放入另一列(在本例中为空活动列)

到目前为止,我已经在pandas中编写了一些代码,将“s”行选择到一个新的数据帧中:

def get_act_line(group):
    return group.ix[(group.Actor == 's')]

result = trimdata.groupby('follow').apply(get_act_line)
我已将此数据框中的行为列复制到活动列,并将参与者和行为值替换为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
我现在想做的是将此数据帧与原始数据帧合并,替换这些选定行中的所有值,但保留原始数据帧中其他行的值

这似乎是一个简单的问题,有一个明显的解决方案,或者也许我一开始就把它搞错了

我读过韦斯·麦金尼的书,我读过关于不同类型的合并、映射、连接、转换、连接等的文档。我浏览过论坛,但没有找到帮助我解决这个问题的答案。非常感谢你的帮助

实现这一点的一种方法(尽管可能有更好或更优雅的方法)是:

其中df相当于您的结果数据帧。这将返回(我的列顺序略有不同):

参考资料:

  • 来自其他STO帖子的解释
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
mask = (df['Actor']=='s')
df['Activity'] = df[mask]['Behavior']
df.ix[mask, 'Behavior'] = np.nan 
  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