programing

팬더를 사용하여 두 열 비교

lastmoon 2023. 6. 6. 10:35
반응형

팬더를 사용하여 두 열 비교

이를 시작점으로 사용

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

처럼 보이는 것.

  one  two three
0   10  1.2   4.2
1   15  70   0.03
2    8   5     0

저는 어떤 것을 사용하고 싶습니다.if판다 내의 진술.

if df['one'] >= df['two'] and df['one'] <= df['three']:
    df['que'] = df['one']

기본적으로▁the▁via를 통해 각 행을 합니다.if진술.

문서에서 사용하라고 합니다..all하지만 예는 없습니다...

np를 사용할 수 있습니다.어디서. 만약에.cond이며, "는 " " 입니다.A그리고.B그러면 어레이입니다.

C = np.where(cond, A, B)

를 C 다음같정다니의합게를과▁c와 합니다.Acond 참다니입입니다.Bcond거짓입니다.

import numpy as np
import pandas as pd

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
                     , df['one'], np.nan)

수확량

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03  NaN
2   8    5     0  NaN

조건이 둘 이상인 경우 np.select를 대신 사용할 수 있습니다.예를 들어, 당신이 원한다면,df['que']df['two'] 때에df['one'] < df['two'],그리고나서

conditions = [
    (df['one'] >= df['two']) & (df['one'] <= df['three']), 
    df['one'] < df['two']]

choices = [df['one'], df['two']]

df['que'] = np.select(conditions, choices, default=np.nan)

수확량

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03   70
2   8    5     0  NaN

라고 가정할 수 있다면,df['one'] >= df['two'] 때에df['one'] < df['two']거짓일 경우, 조건과 선택은 다음과 같이 단순화될 수 있습니다.

conditions = [
    df['one'] < df['two'],
    df['one'] <= df['three']]

choices = [df['two'], df['one']]

( (이 경우에는) 이 아닐 수도 df['one']또는df['two']NaN 포함)


참고:

a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

문자열 값으로 데이터 프레임을 정의합니다.숫자처럼 보이므로 이러한 문자열을 부동 소수점으로 변환하는 것이 좋습니다.

df2 = df.astype(float)

그러나 문자열은 문자별로 비교되는 반면 플로트는 숫자로 비교되므로 결과가 변경됩니다.

In [61]: '10' <= '4.2'
Out[61]: True

In [62]: 10 <= 4.2
Out[62]: False

사용할 수 있습니다..equals열 또는 전체 데이터 프레임에 사용할 수 있습니다.

df['col1'].equals(df['col2'])

만약 둘이 같다면, 그 진술은 다시 돌아올 것입니다.True,또 다른False.

apply()를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

또는 람다를 사용하지 않으려는 경우

def que(x):
    if x['one'] >= x['two'] and x['one'] <= x['three']:
        return x['one']
    return ''
df['que'] = df.apply(que, axis=1)

입니다.df['one']이것은 당신에게 새로운 열을 제공합니다.True.df['one'] 리고그고.False은 가관은입니다.NaN.

▁your▁given▁is다▁by▁just▁the▁boolean니에 의해 주어집니다.if (사문할필있지만가요용)사▁it▁()를 사용해야 )&and):

>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
    one two three   que
0   10  1.2 4.2      10
1   15  70  0.03    NaN
2   8   5   0       NaN

만약 당신이 원한다면,NaN은 값다른값수있습다니대할을 할 수 .fillna 열에 que사용한 적이 있습니다.0여기에 있는 빈 문자열 대신:

>>> df['que'] = df['que'].fillna(0)
>>> df
    one two three   que
0   10  1.2   4.2    10
1   15   70  0.03     0
2    8    5     0     0

안에 , 각개조괄묶다은음로호별을 합니다.&연산자를 사용하여 조건을 결합합니다.

df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']

다음을 사용하여 일치하지 않는 행을 채울 수 있습니다.~하여 일치 항목을 반전합니다.

df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''

은 야합다니해를 사용해야 .&그리고.~and그리고.not&그리고.~연산자는 요소별로 작업합니다.

최종 결과:

df
Out[8]: 
  one  two three que
0  10  1.2   4.2  10
1  15   70  0.03    
2   8    5     0  

다음과 같은 두 열의 값 평등을 비교하려는 사람들을 위해 이 답변을 추가하고 싶습니다.NaN 값, 및을 얻습니다.False이 모두 두 값 이 두 일 때일 때NaN에 따르면, 정에따르면의,,NaN!=NaN(참조: numpy.an(값)은== numpy.nan?) 동일하지 않습니다.

둘을 원한다면,NaN수익률과의 비교True사용할 수 있는 항목:

df['compare'] = (df["col_1"] == df["col_2"]) | (df["col_1"].isna() & df["col_2"].isna())

람다 식 사용:

df[df.apply(lambda x: x['col1'] != x['col2'], axis = 1)]

사용하다np.select데이터 프레임에서 확인해야 할 조건이 여러 개 있고 다른 열에 특정 선택 항목을 출력하는 경우

conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]

df["new column"]=np.select=(condtion,choice,default=)

참고: 조건 없음과 선택지 없음이 일치해야 합니다. 두 가지 조건에 대해 동일한 선택지가 있는 경우 선택지에서 텍스트를 반복합니다.

다음 방법을 사용할 수 있습니다.

df['que'] = df['one'].where((df['one'] >= df['two']) & (df['one'] <= df['three']))

또는 방법:

df['que'] = df.loc[df.eval('(one >= two) & (two <= three)'), 'one']

결과:

  one  two three  que
0  10  1.2   4.2   10
1  15   70  0.03  NaN
2   8    5     0  NaN

OP의 직관에 가장 가까운 것은 인라인 if 진술이라고 생각합니다.

df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) 

두 개의 데이터 프레임 열에 있는 값을 비교하기 위해 여기에 온 경우eq():

df['one'].eq(df['two'])

또는eval()

df.eval("one == two")

그리고 만약 당신이 그것을 하나의 부울로 줄이고 싶다면, 전화하세요.all()결과:

df['one'].eq(df['two']).all()
# or
df.eval("one == two").all()

이것은 다음보다 더 "강력한" 수표입니다.equals()때문에equals()True를 반환하려면 열 dtype도 일치해야 합니다.따라서 한 열이 dtype이면int그리고 다른 하나는 d타입입니다.float,equals()값이 동일하더라도 False를 반환합니다. 반면eq().all()/eval().all()열을 요소별로 단순 비교합니다.

값이 된 경우합니다("NaN"이라는 ).NaN != NaN):

df.eval("one == two or one != one").all()

< BB < 이기 에, OP질경우의인문의이, "A < B and B < C"므로,between():

cond = df['one'].between(df['two'], df['three'])
df['que'] = np.where(cond, df['one'], np.nan)

언급URL : https://stackoverflow.com/questions/27474921/compare-two-columns-using-pandas

반응형