首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据逗号分隔的列和其他两列返回值

根据逗号分隔的列和其他两列返回值
EN

Stack Overflow用户
提问于 2018-11-13 07:22:15
回答 2查看 52关注 0票数 2

我有一个表格:

我想添加一个列(Evaluation),它返回cars列中的一个元素(用逗号分隔)。返回的元素将基于法拉利和丰田的列。“评估”列返回个人没有的元素。以第一排为例,约翰有一辆法拉利,没有丰田。由于John没有丰田,因此评估列返回丰田。

我更喜欢使用cars列做出决定,用逗号分隔文本,并根据法拉利和丰田下的值查找文本

EN

回答 2

Stack Overflow用户

发布于 2018-11-15 14:21:11

您可以使用:

代码语言:javascript
运行
复制
df = pd.DataFrame({'Names':['John'] * 2 + ['Peter'] * 2 + ['Sam'] * 2,
                   'Cars':['Ferrari, Toyota','Ferrari','Ferrari, Toyota','Ferrari',
                           'Ferrari, Toyota','Ferrari, Toyota'],
                   'Ferrari': [1,1,0,0,1,1], 
                   'Toyota': [0,1,1,0,1,0]})

df['Evaluation1'] = df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', ').str.rstrip(', ')
print (df)
   Names             Cars  Ferrari  Toyota      Evaluation1
0   John  Ferrari, Toyota        1       0           Toyota
1   John          Ferrari        1       1                 
2  Peter  Ferrari, Toyota        0       1          Ferrari
3  Peter          Ferrari        0       0  Ferrari, Toyota
4    Sam  Ferrari, Toyota        1       1                 
5    Sam  Ferrari, Toyota        1       0           Toyota

详细信息

首先通过iloc搜索不包含前2的所有列,并创建布尔掩码-通过ne (!=)进行比较:

代码语言:javascript
运行
复制
print (df.iloc[:, 2:].ne(1))
   Ferrari  Toyota
0    False    True
1    False   False
2     True   False
3     True    True
4    False   False
5    False    True

然后使用带有分隔符的列名的dot进行矩阵乘法:

代码语言:javascript
运行
复制
print (df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', '))
0             Toyota, 
1                     
2            Ferrari, 
3    Ferrari, Toyota, 
4                     
5             Toyota, 
dtype: object

并通过rstrip删除最后一个分隔符

代码语言:javascript
运行
复制
print (df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', ').str.rstrip(', '))
0             Toyota
1                   
2            Ferrari
3    Ferrari, Toyota
4                   
5             Toyota
dtype: object

如果不能按位置选择,则可以在不使用0,1的情况下更改列的位置。使用drop删除不必要的列:

代码语言:javascript
运行
复制
df1 = df.drop(['Names','Ferrari'], axis=1).ne(1)
df['Evaluation2'] = df1.dot(df1.columns + ', ').str.rstrip(', ')
票数 1
EN

Stack Overflow用户

发布于 2018-11-13 07:40:08

代码语言:javascript
运行
复制
df = pd.DataFrame({'a': [0,0,1,1], 'b': [0,1,0,1]})

创建以下DataFrame:

代码语言:javascript
运行
复制
   a  b
0  0  0
1  0  1
2  1  0
3  1  1

您可以使用以下命令添加列名列表等于零的新列:

代码语言:javascript
运行
复制
df['evaluated'] = df.apply(lambda x: ','.join(df.columns[x == 0]), axis=1)

输出:

代码语言:javascript
运行
复制
   a  b evaluated
0  0  0       a,b
1  0  1         a
2  1  0         b
3  1  1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53271542

复制
相关文章

相似问题

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