【问题标题】:Comparing data to data in two columns in another data frame to fill third column in the first data frame将数据与另一个数据框中两列中的数据进行比较以填充第一个数据框中的第三列
【发布时间】:2021-10-27 02:22:39
【问题描述】:

我的新手与熊猫的斗争仍在继续,所以我想问一下。

我有两个如下所示的 excel 文件:

id name group lang
1 blue 1
2 azul 1
3 rojo 2
4 red 2
5 green 3
6 verde 3
7 yellow 4

列名可能具有第二个 Excel 文件的西班牙语和英语列中不存在的值,而西班牙语和英语列可能具有列名中不存在的值。我想要所有可能的值。

我的第二个文件如下所示:

english spanish group
blue azul 1
red rojo 2
green verde 3

我想要做的是用值填充第一个数据框的最后一列,所以它看起来像这样:

id name group lang
1 blue 1 en
2 azul 1 sp
3 rojo 2 sp
4 red 2 en
5 green 3 en
6 verde 3 sp
7 yellow 4

我一直在尝试这段代码,但它不起作用:

df2 = pd.melt(df2, id_vars=['group'], value_vars=['en', 'sp'], value_name='lan')
merged_df = pd.merge(df1, df2, left_on='lang', right_on='lan')[['name', 'group', 'lang']]

【问题讨论】:

  • df1 和 df2 是否需要在同一组号中才能被视为匹配?对于是否需要此要求/限制,将有不同的可能解决方案。
  • 发现一些案例要求我们在匹配 df1 和 df2 时也匹配 group。请参阅下面的编辑。

标签: python python-3.x pandas


【解决方案1】:

考虑你的例子

df = pd.DataFrame([['red', 'rojo', 2], ['blue', 'azul', 1]],  columns = ['english', 'spanish', 'group'])
df2 = pd.DataFrame([['red', 2], ['blue', 1], ['azul', 1]],  columns = ['name', 'group'])

你可以这样做:

eng_df = pd.merge(df2, df, how='inner', left_on=['group', 'name'], right_on=['group','english'] )
eng_df['leng'] = 'en'
sp_df = pd.merge(df2, df, how='inner', left_on=['group', 'name'], right_on=['group','spanish'] )
sp_df['leng'] = 'sp'
eng_df.append(sp_df)[['name','group','leng']].reset_index()

Checkout output here

也许不是最直接的解决方案,但至少它有效。

如果不需要,您可以跳过加入“组”,但我认为这很重要,因为您在示例中提到了它。

【讨论】:

    【解决方案2】:

    您可以使用np.where.isin()

    df["lang"] = np.where(
        df["name"].isin(df2["english"]),
        "en",
        np.where(df["name"].isin(df2["spanish"]), "sp", ""),
    )
    

    打印:

       id    name  group lang
    0   1    blue      1   en
    1   2    azul      1   sp
    2   3    rojo      2   sp
    3   4     red      2   en
    4   5   green      3   en
    5   6   verde      3   sp
    6   7  yellow      4     
    

    【讨论】:

    • 此解决方案与group 号码不匹配,可能会导致错误匹配(例如,在某些情况下,错误匹配 'en' 而它是 'sp',反之亦然。
    【解决方案3】:

    group列上使用df.merge()左连接,然后根据name列与哪种语言匹配设置lang列:

    df1 = df1.merge(df2, how='left', on='group')
    

    生成的 df1:

       id    name  group lang english spanish
    0   1    blue      1         blue    azul
    1   2    azul      1         blue    azul
    2   3    rojo      2          red    rojo
    3   4     red      2          red    rojo
    4   5   green      3        green   verde
    5   6   verde      3        green   verde
    6   7  yellow      4          NaN     NaN
    

    然后设置列lang如下:

    df1['lang'] = np.where(df1['name'] == df1['english'], 'en', df1['lang'])
    df1['lang'] = np.where(df1['name'] == df1['spanish'], 'sp', df1['lang'])
    

    生成的 df1:

       id    name  group lang english spanish
    0   1    blue      1   en    blue    azul
    1   2    azul      1   sp    blue    azul
    2   3    rojo      2   sp     red    rojo
    3   4     red      2   en     red    rojo
    4   5   green      3   en   green   verde
    5   6   verde      3   sp   green   verde
    6   7  yellow      4          NaN     NaN
    

    然后您可以按如下方式清理englishspanish 列:

    df1 = df1.drop(columns=['english', 'spanish'])
    

    生成的 df1:

       id    name  group lang
    0   1    blue      1   en
    1   2    azul      1   sp
    2   3    rojo      2   sp
    3   4     red      2   en
    4   5   green      3   en
    5   6   verde      3   sp
    6   7  yellow      4     
    

    编辑:匹配group 有必要吗?

    有一些英语和西班牙语单词拼写相同但含义不同。例如,

    因此,在 df2 中,我们可能有:

    english spanish group
    pie tarta 5
    foot pie 6

    而在 df1 中,'pie' 实际上在第 6 组中:

    id name group lang
    8 pie 6

    所以,如果我们不匹配 group,我们可能会错误地将 df2 第 5 组中的英文“pie”取为 df2 第 6 组中的西班牙语“pie”(= 英文中的脚) .

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2020-03-20
      • 2019-05-12
      • 1970-01-01
      • 2022-08-10
      • 2020-08-13
      相关资源
      最近更新 更多