首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多个列映射到pandas中的新列

将多个列映射到pandas中的新列
EN

Stack Overflow用户
提问于 2019-06-05 22:21:24
回答 2查看 634关注 0票数 2

我有一个pandas dataframe,如下所示,现在我正在尝试将多个列值映射到新列,基本上是一个多对一映射。

数据帧:

代码语言:javascript
复制
 a   b   c    d    e    f    g    h
 0       2         6   -2   10     
     1   3                   4    7
     2  3.5  4.5   8   10.5       8.5
0.5          7.5        6.4       10

我创建了一个字典,显示哪些列属于新列,如下所示。

如果所有列中都有值,则新列应采用最大值,如果没有值,则新列应具有NaN。

字典:

代码语言:javascript
复制
 {x : [a, c, d],
 {y : [b, e, g],
 {z : [f, h]}`

预期的数据帧:

代码语言:javascript
复制
 a   b   c    d    e    f    g    h    x    y    z
 0       2          6   -2   10        2    10  -2
     1   3                   4    7    3    4    7
     2  3.5  4.5   8   10.5       8.5  4.5  8   10.5
0.5          7.5        6.4       10   7.5       10

我不太确定如何处理这个问题,如果我能得到一些帮助,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-05 22:26:55

如果列表中的所有值都是唯一的,则可以在字典理解中更改字典,将maxjoin聚合在一起:

代码语言:javascript
复制
d =  {'x' : ['a', 'c', 'd'],'y' : ['b', 'e', 'g'], 'z' : ['f', 'h']}

#swap key values in dict
#http://stackoverflow.com/a/31674731/2901002
d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
#convert string repr of numbers to numeric columns
df = df.apply(lambda x: pd.to_numeric(x,errors='coerce'))
df = df.join(df.groupby(d1, axis=1).max())
print (df)
     a    b    c    d    e     f     g    h    x     y     z
0  0.0  NaN  2.0  NaN  6.0  -2.0  10.0  NaN  2.0  10.0  -2.0
1  NaN  1.0  3.0  NaN  NaN   NaN   4.0  7.0  3.0   4.0   7.0
2  NaN  2.0  3.5  4.5  8.0  10.5   8.5  NaN  4.5   8.5  10.5
3  0.5  NaN  7.5  NaN  6.4   NaN  10.0  NaN  7.5  10.0   NaN

但是如果可能的话,列表中的值应该是重复的(不是所有列表都是唯一的):

代码语言:javascript
复制
d =  {'x' : ['a', 'c', 'd', 'e', 'f'],'y' : ['b', 'e', 'g', 'a'], 'z' : ['f', 'h']}
for k, v in d.items():
    df[k] = df.loc[:, v].max(axis=1) 
print (df)
     a    b    c    d    e     f     g    h     x     y     z
0  0.0  NaN  2.0  NaN  6.0  -2.0  10.0  NaN   6.0  10.0  -2.0
1  NaN  1.0  3.0  NaN  NaN   NaN   4.0  7.0   3.0   4.0   7.0
2  NaN  2.0  3.5  4.5  8.0  10.5   8.5  NaN  10.5   8.5  10.5
3  0.5  NaN  7.5  NaN  6.4   NaN  10.0  NaN   7.5  10.0   NaN
票数 3
EN

Stack Overflow用户

发布于 2019-06-05 22:26:22

你可以groupby dict,然后concat back,在此之前我们需要调整你的dict

代码语言:javascript
复制
d={'x': ['a', 'c', 'd'],'y': ['b', 'e', 'g'],'z': ['f', 'h']}
from itertools import chain
d=dict(chain(*map(dict.items, [dict.fromkeys(y,x) for x,y in d.items()])))
df=pd.concat([df,df.groupby(d,axis=1).max()],axis=1)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56462445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档