我有一个表格:
我想添加一个列(Evaluation),它返回cars列中的一个元素(用逗号分隔)。返回的元素将基于法拉利和丰田的列。“评估”列返回个人没有的元素。以第一排为例,约翰有一辆法拉利,没有丰田。由于John没有丰田,因此评估列返回丰田。
我更喜欢使用cars列做出决定,用逗号分隔文本,并根据法拉利和丰田下的值查找文本
发布于 2018-11-15 14:21:11
您可以使用:
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
(!=
)进行比较:
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
进行矩阵乘法:
print (df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', '))
0 Toyota,
1
2 Ferrari,
3 Ferrari, Toyota,
4
5 Toyota,
dtype: object
并通过rstrip
删除最后一个分隔符
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
删除不必要的列:
df1 = df.drop(['Names','Ferrari'], axis=1).ne(1)
df['Evaluation2'] = df1.dot(df1.columns + ', ').str.rstrip(', ')
发布于 2018-11-13 07:40:08
df = pd.DataFrame({'a': [0,0,1,1], 'b': [0,1,0,1]})
创建以下DataFrame:
a b
0 0 0
1 0 1
2 1 0
3 1 1
您可以使用以下命令添加列名列表等于零的新列:
df['evaluated'] = df.apply(lambda x: ','.join(df.columns[x == 0]), axis=1)
输出:
a b evaluated
0 0 0 a,b
1 0 1 a
2 1 0 b
3 1 1
https://stackoverflow.com/questions/53271542
复制相似问题