이것을 시작점으로 사용 :
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
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']
기본적으로 if
문을 통해 각 행을 확인하고 새 열을 만듭니다.
문서는 사용하라고 말하지만 .all
예가 없습니다 …
답변
np.where 사용할 수 있습니다 . 경우 cond
부울 배열하고, A
그리고 B
다음, 배열 인
C = np.where(cond, A, B)
C가 A
어디가 cond
True이고 B
어디가 cond
False인지를 정의합니다.
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']
가 False 라고 가정 할 수 있다면 조건과 선택을 다음과 같이 단순화 할 수 있습니다.
conditions = [
df['one'] < df['two'],
df['one'] <= df['three']]
choices = [df['two'], df['one']]
(가정은 NaN을 포함 df['one']
하거나 df['two']
포함하는 경우 사실이 아닐 수 있습니다 .)
참고
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
문자열 값으로 DataFrame을 정의합니다. 숫자처럼 보이기 때문에 해당 문자열을 부동 소수점으로 변환하는 것이 더 나을 수 있습니다.
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
, else 를 반환 합니다 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
.
Boolean 시리즈는 귀하의 if
진술에 의해 제공됩니다 ( &
대신 사용해야하지만 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']
일치 ~
를 반전시키기 위해 ( “not”연산자)를 사용하여 일치하지 않는 행을 채울 수 있습니다 .
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
답변
사용하여 np.select
다른 열에서 dataframe 및 출력 특정 선택에서 검사 할 여러 조건이있는 경우
conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]
df["new column"]=np.select=(condtion,choice,default=)
참고 : 조건 및 선택 항목이 일치하지 않아야합니다. 두 개의 다른 조건에 대해 동일한 선택이있는 경우 선택한 텍스트를 반복합니다.
답변
OP의 직감에 가장 가까운 것은 인라인 if 문이라고 생각합니다.
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))