根据其他两个列和表在 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】:
pandas
lookup
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 中创建列的主要内容,如果未能解决你的问题,请参考以下文章