Python Numpy с Datafame np.select со значениями массива - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать новый столбец на основе нескольких условий разных столбцов. Мой код работает без ошибок трассировки. Ниже приведен фрагмент фрейма данных и кода.

This is the starting data

import pandas as pd
import numpy as np

dfc = pd.read_csv(r'C:\\Users\\...01.csv', header='infer')

condition = [dfc['N']==0, dfc['count']==dfc['N'], (dfc['count'] > dfc['N']) & (dfc['N'] != 0)]
rng_result = [str(dfc['i']) + '-' + str(dfc['a']),'None','None to Many'] 
dfc['rng'] = np.select(condition, rng_result, np.nan)

dfc.to_csv(r'C:\\Users\\...R_01.csv', index=False)

It might be that I don't understand numpy, the middle and last conditions come out fine. The first condition provide an array, which is not wanted. I want a string with the rows 'i' and 'a' value as I typed it below.

введите описание изображения здесь

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Условия не очевидны из вопроса, но предназначен ли вопрос для решения следующих вопросов? Я использую np.where() для объединения строк в случае «Истина».

import pandas as pd
import numpy as np
import io

data = '''
count,i,a,N
1,1.4,1.4,0
1,0,0,1
2,110,140,0
3,0,0,3
4,3.5,5.1,0
4,19,22,0
'''

df = pd.read_csv(io.StringIO(data), sep=',')
df['rng'] = np.where((df['N'] == 1)|(df['N'] == 3), None, df['i'].astype(str)+'-'+df['a'].astype(str))
df
count   i     a       N rng
0   1   1.4   1.4     0 1.4-1.4
1   1   0.0   0.0     1 None
2   2   110.0   140.0   0   110.0-140.0
3   3   0.0   0.0     3 None
4   4   3.5   5.1     0 3.5-5.1
5   4   19.0    22.0    0   19.0-22.0
1 голос
/ 09 июля 2020

Используя apply, я считаю его более читаемым и поддерживаемым

data = [["count","i","a","N"],
       [1,1.4,1.4,0],
       [1,0,0,1],
       [2,110,140,0],
       [3,0,0,3],
        [4,3.5,5.1,0],
        [4,19,22,0],
        [50,0,17,21],
        [25,0,0,25]]

def cond(r):
    val = "tbd"
    if r.N==0: val = str(r.i)+"-"+str(r.a) 
    if r["count"]==r.N: val = "None"
    if (r['count'] > r['N']) and (r['N'] != 0): val = 'None to Many'
    return val

df = pd.DataFrame(data[1:], columns=data[0])
df["rng"] = df.apply(lambda r: cond(r), axis=1)

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