Создать новый DataFrame Pandas на основе существующего DataFrame и условного оператора - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь создать новый DataFrame на основе значений из существующего DataFrame

Исходный DataFrame

a = pd.DataFrame({'x': ['1', '2', '3', '4', '5'], 'y': ['1', '---', '1', '1', '1']})

    x   y
0   1   1
1   2   ---
2   3   1
3   4   1
4   5   1

Целевой целевой DataFrame

b = pd.DataFrame({'z': int(a['x']) + int(a['y']) if a['y'] != '---' else '---'})

    z
0   2
1   ---
2   4
3   5
4   6

Я получаю " ValueError: Истинное значение Серии неоднозначно "

Кто-то знает и может дать мненамек?

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Если ваш фрейм данных был чисто образован числами, встроенный код, подобный этому a.astype(int).sum(axis = 1), решил бы вашу проблему.

Но так как вы не можете гарантировать, что в каждой строке есть числа, вам придется перебирать строки и выполнять необходимые вычисления в зависимости от вашего состояния. В приведенном ниже примере я использую функцию apply вместе с лямбда-выражением для достижения желаемого результата.

pd.DataFrame(
    dict(
   z = a.apply(lambda r: int(r['x']) + int(r['y']) if r['y'] != '---' else '---' , axis=1 )
    )
)

Чтобы подать заявку в том же DF, проверьте ниже:

a['z'] = a.apply(lambda r: int(r['x']) + int(r['y']) if r['y'] != '---' else '---' , axis=1 )
0 голосов
/ 10 апреля 2019

Следующее решение захватывает индекс, где y!='---', а затем суммирует значения в a['x'] & a['y'] для этого индекса. Важно преобразовать dtype в int перед суммированием.

a = pd.DataFrame({'x': ['1', '2', '3', '4', '5'], 'y': ['1', '---', '1', '1', '1']})
a['z'] = None

indexer = a['y'].loc[lambda x:x!='---'].index

a['z'] = a[a.index.isin(indexer)]['x'].astype(int) + a[a.index.isin(indexer)]['y'].astype(int)

a.loc[a['z'].isna(), 'z'] = '---'

b = a[['z']]

print(b)
#Output

    z
0   2
1   ---
2   4
3   5
4   6

Предполагается, что '---' является единственным символом в вашем наборе данных, и там, где условие не выполняется, значения z равны NaN. Эти значения NaN затем устанавливаются на --- в a['z'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...