遍历pandas数据框中的列列表

时间:2019-11-02 18:50:12

标签: python-3.x pandas

我有一个如下数据框。我想根据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

6 个答案:

答案 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)

使用DataFrame.mask

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)