我有一个如下数据框。我想根据A和B列更新C,D,E列的值。
如果列A ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().错误
import pandas as pd
import math
import sys
import re
data=[[0,1,0,0, 0],
[1,2,0,0,0],
[2,0,0,0,0],
[2,4,0,0,0],
[1,8,0,0,0],
[3,2, 0,0,0]]
df
Out[59]:
A B C D E
0 0 1 0 0 0
1 1 2 0 0 0
2 2 0 0 0 0
3 2 4 0 0 0
4 1 8 0 0 0
5 3 2 0 0 0
df = pd.DataFrame(data,columns=['A','B','C', 'D','E'])
list_1 = ['C', 'D', 'E']
for i in df[list_1]:
if df['A'] < df['B']:
df[i] = df['A']
else:
df['i'] = df['B']
我期望下面的输出:
df
Out[59]:
A B C D E
0 0 1 0 0 0
1 1 2 1 1 1
2 2 0 0 0 0
3 2 4 2 2 2
4 1 8 1 1 1
5 3 2 2 2 2
答案 0 :(得分:1)
np.where
返回条件根据条件从A或B中选择。
df.assign
将新列分配给DataFrame。
返回一个新对象,除了新列外,它还包含所有原始列。重新分配的现有列将被覆盖。
nums = np.where(df.A < df.B, df.A, df.B)
df = df.assign(C=nums, D=nums, E=nums)
答案 1 :(得分:1)
df.loc[:,df.columns != 'B']=df.loc[:,df.columns != 'B'].mask(df['B']>df['A'],df['A'],axis=0)
print(df)
A B C D E
0 0 1 0 0 0
1 1 2 1 1 1
2 2 0 0 0 0
3 2 4 2 2 2
4 1 8 1 1 1
5 3 2 0 0 0
答案 2 :(得分:0)
我不知道您要在这里实现什么。因为条件df['A'] < df['B']
将始终在循环中返回相同的输出。只是为了理解:
当您if df['A'] < df['B']:
if
条件预期为Boolean
,但是df['A'] < df['B']
给出了Series
个值的Boolean
。因此,它说要么使用类似
if (df['A'] < df['B']).all():
OR
if (df['A'] < df['B']).any():
答案 3 :(得分:0)
我个人总是使用 .apply 来基于其他列修改列
list_1 = ['C', 'D', 'E']
for i in list_1:
df[i]=df.apply(lambda x: x.a if x.a<x.b else x.b, axis=1)
答案 4 :(得分:0)
我要做的是只创建带有列“ A”和“ B”的DataFrame,然后按以下方式创建列“ C”:
df['C'] = df.min(axis=1)
列'D'和'E'似乎是多余的。
如果必须从所有列开始,并且需要将所有列都作为输出,则可以执行以下操作:
df['C'] = df[['A', 'B']].min(axis=1)
df['D'] = df['C']
df['E'] = df['C']
答案 5 :(得分:0)
您可以在where
中使用函数numpy
:
df.loc[:,'C':'E'] = np.where(df['A'] < df['B'], df['A'], df['B']).reshape(-1, 1)