【问题标题】:Pandas DataFrame join/merge on "Value1" in "Value2"Pandas DataFrame 在“Value2”中的“Value1”上加入/合并
【发布时间】:2019-10-20 00:24:54
【问题描述】:

我有 2 个数据框要合并在一起。在 df1 中,它的“id”为 A、B、C……,而在 df2 中,“id”为 A1、A2、A3、……、B1、B2、B3……我想合并他们的条件是df1.id in df2.id。我查看了教程,搜索了 StackOverflow,但没有看到任何相关内容。

df1 的键是 df2 中的键的子集。所以一个简单的 pd.merge(df1, df2, on='id', how...) 会导致数据框不正确。

设置:

dummy_data1 = {
        'id': ['A', 'B', 'C', 'D', 'E'],
        'Feature1': ['1', '2', '3', '4', '5'],
        'Feature2': ['6', '7', '8', '9', '10']}

dummy_data2 = {
        'id': ['A1', 'A2', 'A3', 'B1', 'B2'],
        'Feature1': ['a', 'b', 'c', 'd', 'e'],
        'Feature2': ['f', 'g', 'h', 'i', 'j']}

df1 = pd.DataFrame(dummy_data1, columns = dummy_data1.keys())
df2 = pd.DataFrame(dummy_data2, columns = dummy_data2.keys())

期望的输出:

    id   Feature1_x   Feature2_x   Feature1_y   Feature2_y
0   A1   1            6            a            f
1   A2   1            6            b            g
2   A3   1            6            c            h
3   B1   2            7            d            i
4   B2   2            7            e            j

尝试 1:

newdf = pd.merge(df1['id'], df2['id'], on='id', how='inner')

结果 1:

Empty DataFrame
Columns: [id]
Index: []

尝试 2:

newdf = pd.merge(df1['id'], df2['id'], on='id', how='outer')

结果 2:

   id
0   A
1   B
2   C
3   D
4   E
5  A1
6  A2
7  A3
8  B1
9  B2

尝试 3:

newdf = pd.merge(df1['id'], df2['id'].str[:1], on='id', how='inner')

结果 3:

  id
0  A
1  A
2  A
3  B
4  B

【问题讨论】:

  • Pandas Merging 101 的可能副本 看看这个,它会回答你的问题,你需要决定是否要进行内连接、外连接或左连接
  • 这个也很简单pd.merge(df1['id'], df2['id'], on='id',how...)good luck
  • 这些都没有回答我的问题。 on='id', how... 是不够的,因为这两个 id 不相等,但一个是另一个的子集。这就是为什么我需要string1 in string2 条件。
  • 你能拿一片 df2 id 来做合并吗? pd.merge(df1['id'], df2['id'].str[:6], on='id',how...)
  • 我尝试了您的建议,并让子字符串部分返回,但我需要超字符串。我需要A1, A2, A3... 在生成的df 中,而不仅仅是A, A, A,...。

标签: python pandas dataframe join merge


【解决方案1】:

您可以创建一个仅包含来自“id”的字母的新列。您可以根据需要更改正则表达式。然后您可以合并该新列,最后在结果中获得所需的列。

df2['new_id'] = df2['id'].apply(lambda x: re.search(r'[A-Z]',x).group())

df1.merge(df2, left_on='id',right_on='new_id')[['id_y','Feature1_x','Feature2_x','Feature1_y','Feature2_y']]

    id_y    Feature1_x  Feature2_x  Feature1_y  Feature2_y
0   A1          1          6           a         f
1   A2          1          6           b         g
2   A3          1          6           c         h
3   B1          2          7           d         i
4   B2          2          7           e         j

假设:您在 df2 中有 id,其类型为 'A1'、'A2'、'B1' 等。

【讨论】:

  • 我很喜欢这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多