【问题标题】:Pandas left join were NA values on right table are taken as a wildcardPandas 左连接是右表上的 NA 值作为通配符
【发布时间】:2020-09-13 08:08:23
【问题描述】:

有谁知道将 NA 值作为通配符在多列上连接 2 个数据帧的有效方法?

我的用例示例:

我有一个这样的数据框df_a

stop1   stop2   stop3   stop4   stop5   stop6   stop7
ES       IT      GB      DE      AT      US      CA
ES       IT      DE      CH         

还有一个数据框df_p 具有这样的动作模式(可能包含或不包含 NA 值的停止和动作序列):

stop1   act1    stop2   act2    stop3   act3    stop4     act4
ES      sell     IT                             
ES      sell     IT     sell                      DE      buy
DE      buy      CH                         

我想离开加入 df_adf_p 并使用列匹配分配模式,将空值作为 comodin

在这种情况下,预期的输出应该是:

stop1   act1   stop2    act2   stop3    act3   stop4    act4    stop5   act5    stop6   act6   stop7
ES      sell    IT      sell    GB               DE      buy     AT              US             CA
ES      sell    IT              DE      buy      CH         

第一行匹配第 1 行和第 2 行中的模式,但第 2 行匹配更多行,因此我们分配了该行。第二行匹配路由模式 1 的开头和路由模式 3 的结尾,因此我们将两者都分配。

我正在处理大量数据,因此我需要一种有效的方法来执行此操作。另外,您认为逐行迭代或使用 pd.merge 更好吗?

提前致谢,

阿尔伯托

【问题讨论】:

  • 我不明白您的预期输出。为什么第 2 行 col 'act3' 中有 'buy'?该值不会出现在输入数据集的“act3”列中。
  • 嗨,戴夫,感谢您的检查。是因为df_p 包含相对位置,所以我需要在每一步都加入它。在这种情况下:df_a.merge(df_p, how= 'left', left_on = ['stop3', 'stop4','stop5','stop6','stop7'], right_on =['stop1', 'stop2','stop3','stop4'])
  • 即使你这样做了,你仍然不会得到从'act4'到'act3'的'buy'。
  • 所以这是主要问题,如何加入将na 值作为通配符

标签: python pandas merge out-of-memory na


【解决方案1】:

最好的方法是使用merge。如果您不指定公共列,它将查找它们:

df = df_a.merge(df_p, how='left')
df.fillna('', inplace=True)
print(df)

  stop1 stop2 stop3 stop4 stop5 stop6 stop7 act1 act2 act3 act4
0    ES    IT    GB    DE    AT    US    CA
1    ES    IT    DE    CH             

【讨论】:

  • 嗨纽约编码员,感谢您的检查。在这种情况下,所有列都是通用的,我需要的是连接将 na 值作为通配符(我在问题末尾添加了一个带有所需输出的表)
猜你喜欢
  • 2021-03-10
  • 2018-09-05
  • 1970-01-01
  • 2020-07-28
  • 2019-05-05
  • 2011-12-21
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多