根据其他两个列和表在 pandas 中创建列

Posted

技术标签:

【中文标题】根据其他两个列和表在 pandas 中创建列【英文标题】:Create column in pandas based on two other columns and table 【发布时间】: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 个值。 【参考方案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

【讨论】:

以上是关于根据其他两个列和表在 pandas 中创建列的主要内容,如果未能解决你的问题,请参考以下文章

根据表达式在 fetchrequest 中创建列

Pyspark:如何在不同条件的数据框中创建列

在 Pandas 中创建列联表

根据其他列中的值在 python 3 (pandas) 数据框中创建新列

根据其他两列的值在 Pandas 中创建一个新列[重复]

在R中创建列联表的问题