перебирая список столбцов в панде - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть датафрейм, как показано ниже. Я хочу обновить значение столбца C, D, E на основе столбцов A и B.

Если столбец 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 ]

1 голос
/ 02 ноября 2019

Использование 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
1 голос
/ 02 ноября 2019

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)
0 голосов
/ 02 ноября 2019

Вы можете использовать функцию where в numpy:

df.loc[:,'C':'E'] = np.where(df['A'] < df['B'], df['A'], df['B']).reshape(-1, 1)
0 голосов
/ 02 ноября 2019

Что бы я сделал, я бы только создал DataFrame со столбцами «A» и «B», а затем создал столбец «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']
0 голосов
/ 02 ноября 2019

лично я всегда использую .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)
0 голосов
/ 02 ноября 2019

Я не знаю, чего вы здесь добиваетесь. Потому что условие df['A'] < df['B'] всегда будет возвращать один и тот же вывод в вашем цикле. Просто для понимания:

Когда вы делаете if df['A'] < df['B']:

Условие if ожидает Boolean, но df['A'] < df['B'] дает Series из Boolean значений. Таким образом, он говорит, что либо использовать что-то вроде

if (df['A'] < df['B']).all():

ИЛИ

if (df['A'] < df['B']).any():
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...