【问题标题】:join/merge pandas dataframes where index is substring of other index加入/合并熊猫数据帧,其中索引是其他索引的子字符串
【发布时间】:2020-10-19 02:07:12
【问题描述】:

我想加入(或合并)2 个数据帧,其中第二个数据帧的索引是第一个数据帧的子字符串。 我可以通过创建一个作为索引子字符串的临时列然后加入该列来做到这一点,但我确信还有另一种更智能的方法来做到这一点。

df1:

XX0001S1    4
XX0001S2    4.5
XX0001S3    4
XX0253S1    13
XX0254S3    5

df2

XX0001  good
XX0253  bad
XX0254  average

结果应该是:

XX0001S1    4   good
XX0001S2    4.5 good
XX0001S3    4   good
XX0253S1    13  bad
XX0254S3    5   average

有什么想法吗?

M.

【问题讨论】:

  • 您好,我认为没有比临时创建专栏更好的方法了。这个解决方案有什么问题?

标签: pandas dataframe join merge


【解决方案1】:

重要提示:如果regex-reserved characters 存在于短索引中,此解决方案可能会失败。

使用string accessor 可以避免显式创建新列,如this answer 所示。只需将找到的短索引映射到相应的文本值。

数据

为方便起见,为示例数据列分配了名称。只需将它们替换为实际的即可。

df
Out[75]:
          val1
XX0001S1   4.0
XX0001S2   4.5
XX0001S3   4.0
XX0253S1  13.0
XX0254S3   5.0

df2
Out[77]:
           text
XX0001     good
XX0253      bad
XX0254  average

代码

解决方案可以放入单行中。为了清楚起见,我单独写了。

# 1. regex search pattern at string beginning
patt = "^(" + "|".join(df2.index.values) + ")"

# 2. find corresponding substrings via accessor
idx2_values = df.index.str.extract(patt, expand=False)

# 3.map index to the contents
df["text"] = df2.loc[idx2_values, "text"].values

# result
df
Out[108]: 
          val1     text
XX0001S1   4.0     good
XX0001S2   4.5     good
XX0001S3   4.0     good
XX0253S1  13.0      bad
XX0254S3   5.0  average

【讨论】:

  • 非常感谢您的快速回复!
猜你喜欢
  • 2018-02-02
  • 2018-04-20
  • 1970-01-01
  • 2019-03-18
  • 2020-08-22
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多