【问题标题】:Create column in pandas based on two other columns and table根据其他两个列和表在 pandas 中创建列
【发布时间】:2019-01-22 17:51:43
【问题描述】:
table = pd.DataFrame(data=[[1,2,3],[4,5,6],[7,8,9]],
                 columns=['High','Middle','Low'],
                index=['Blue','Green','Red'])

df = pd.DataFrame(data=[['High','Blue'],
                    ['High','Green'],
                    ['Low','Red'],
                   ['Middle','Blue'],
                    ['Low','Blue'],
                    ['Low','Red']],
             columns=['A','B'])

>>> df
        A      B
0    High   Blue
1    High  Green
2     Low    Red
3  Middle   Blue
4     Low   Blue
5     Low    Red

>>> table
       High  Middle  Low
Blue      1       2    3
Green     4       5    6
Red       7       8    9

我正在尝试添加基于表中值的第三列“C”。所以第一行的值为 1,第二行的值为 4,依此类推。

如果这是一维查找,我会将表转换为字典并使用df['C'] = df['A'].map(table)。但是,由于这是二维的,我无法弄清楚如何使用 map 或 apply。

理想情况下,我会将表格转换为字典格式,以便将其与其他字典一起保存在 json 中,但这不是必需的。

【问题讨论】:

  • 如果您所追求的是将您的 table 值映射到 df 中的分类对,您为什么不尝试以下操作:table.unstack().reset_index()。这会将您的表格分解为您想要操作的 9 个值。

标签: python pandas dictionary mapping


【解决方案1】:

pandaslookup

table.lookup(df.B,df.A)
Out[248]: array([1, 4, 9, 2, 3, 9], dtype=int64)

#table['c']=table.lookup(df.B,df.A)

或者df.apply(lambda x : table.loc[x['B'],x['A']],1)个人不喜欢apply

【讨论】:

    【解决方案2】:

    您可以为此使用merge

    df2 = (df.merge(table.stack().reset_index(),
                    left_on=['A','B'], right_on=['level_1', 'level_0'])
           .drop(['level_0', 'level_1'], 1)
           .rename(columns={0:'C'}))
    
    >>> df2
            A      B  C
    0    High   Blue  1
    1    High  Green  4
    2     Low    Red  9
    3     Low    Red  9
    4  Middle   Blue  2
    5     Low   Blue  3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 2021-03-19
      • 2020-08-18
      • 1970-01-01
      • 2017-08-26
      • 2020-09-10
      • 2020-09-24
      • 1970-01-01
      相关资源
      最近更新 更多