팬더 데이터 프레임에서 두 열의 값을 단일 열로 병합합니다.
저는 T-SQL에서 Coalse와 유사하게 동작하는 방법을 찾고 있습니다.팬더 데이터 프레임에 드문드문 들어 있는 두 개의 열(A열과 B열)이 있습니다.다음 규칙을 사용하여 새 열을 만들고자 합니다.
- 열 A의 값이 null이 아니면 새 열 C에 해당 값을 사용합니다.
- 열 A의 값이 null이면 새 열 C에 열 B의 값을 사용합니다.
말씀드린 것처럼, 이는 MS SQL Server에서 Coales 함수를 통해 달성할 수 있습니다.나는 이것에 대한 좋은 피톤적인 방법을 찾지 못했는데, 그것이 존재합니까?
combine_first 를 사용합니다.
In [16]: df = pd.DataFrame(np.random.randint(0, 10, size=(10, 2)), columns=list('ab'))
In [17]: df.loc[::2, 'a'] = np.nan
In [18]: df
Out[18]:
a b
0 NaN 0
1 5.0 5
2 NaN 8
3 2.0 8
4 NaN 3
5 9.0 4
6 NaN 7
7 2.0 0
8 NaN 6
9 2.0 5
In [19]: df['c'] = df.a.combine_first(df.b)
In [20]: df
Out[20]:
a b c
0 NaN 0 0.0
1 5.0 5 5.0
2 NaN 8 8.0
3 2.0 8 2.0
4 NaN 3 3.0
5 9.0 4 9.0
6 NaN 7 7.0
7 2.0 0 2.0
8 NaN 6 6.0
9 2.0 5 2.0
다중 열에 대해 다음과 같이 병합
은 두 의 열에 할 수 개의 , 만약 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δn
:열:n > 2
:
예제 데이터프레임:
import numpy as np
import pandas as pd
df = pd.DataFrame({'col1':[np.NaN, 2, 4, 5, np.NaN],
'col2':[np.NaN, 5, 1, 0, np.NaN],
'col3':[2, np.NaN, 9, 1, np.NaN],
'col4':[np.NaN, 10, 11, 4, 8]})
print(df)
col1 col2 col3 col4
0 NaN NaN 2.0 NaN
1 2.0 5.0 NaN 10.0
2 4.0 1.0 9.0 11.0
3 5.0 0.0 1.0 4.0
4 NaN NaN NaN 8.0
을 해서.DataFrame.bfill
축 에 축로열(()axis=1
으로 을 에도 의 에도 을 으로 n
양
게다가, 이것은 또한 그들에게 효과가 있을 것입니다.string type
기둥!!
df['coalesce'] = df.bfill(axis=1).iloc[:, 0]
col1 col2 col3 col4 coalesce
0 NaN NaN 2.0 NaN 2.0
1 2.0 5.0 NaN 10.0 2.0
2 4.0 1.0 9.0 11.0 4.0
3 5.0 0.0 1.0 4.0 5.0
4 NaN NaN NaN 8.0 8.0
을 해서.Series.combine_first
(꽤 수 이 증가할 때 결국 수 대답),질수며의이면다국게수릴인변d다(게d,수ttt릴rw히en인t(변 .
df['coalesce'] = (
df['col1'].combine_first(df['col2'])
.combine_first(df['col3'])
.combine_first(df['col4'])
)
col1 col2 col3 col4 coalesce
0 NaN NaN 2.0 NaN 2.0
1 2.0 5.0 NaN 10.0 2.0
2 4.0 1.0 9.0 11.0 4.0
3 5.0 0.0 1.0 4.0 5.0
4 NaN NaN NaN 8.0 8.0
이것도 시도해보세요.기억하기 쉬운 항목:
df['c'] = np.where(df["a"].isnull(), df["b"], df["a"] )
빠릅니다: 이 이 df['c'] = np.where(df["a"].isnull() == True, df["b"], df["a"] )
%timeit df['d'] = df.a.combine_first(df.b)
1000 loops, best of 3: 472 µs per loop
%timeit df['c'] = np.where(df["a"].isnull(), df["b"], df["a"] )
1000 loops, best of 3: 291 µs per loop
combine_first
는 가장 간단한 옵션입니다.제가 아래에서 개요를 설명하는 다른 몇 가지가 있습니다.다른 사례에 적용할 수 있는 몇 가지 해결책에 대해 설명하겠습니다.
Case #1: 비상호 배타적 NaNs
에 NaN이 것은 , 이 NaN 은 에 은 에 NaN
s는 열 사이에 상호 배타적이지 않습니다.
df = pd.DataFrame({
'a': [1.0, 2.0, 3.0, np.nan, 5.0, 7.0, np.nan],
'b': [5.0, 3.0, np.nan, 4.0, np.nan, 6.0, 7.0]})
df
a b
0 1.0 5.0
1 2.0 3.0
2 3.0 NaN
3 NaN 4.0
4 5.0 NaN
5 7.0 6.0
6 NaN 7.0
에 먼저 a
.
df['a'].mask(pd.isnull, df['b'])
# df['a'].mask(df['a'].isnull(), df['b'])
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 7.0
6 7.0
Name: a, dtype: float64
df['a'].where(pd.notnull, df['b'])
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 7.0
6 7.0
Name: a, dtype: float64
다음을 사용하여 유사한 구문을 사용할 수 있습니다.np.where
.
에 하기 위해서는 , 하는 .b
, , , , , , ,
Case #2: 상호 배타적 위치 결정 NaNs
모든 행에 다음이 있습니다.NaN
열 사이에 상호 배타적인 s.
df = pd.DataFrame({
'a': [1.0, 2.0, 3.0, np.nan, 5.0, np.nan, np.nan],
'b': [np.nan, np.nan, np.nan, 4.0, np.nan, 6.0, 7.0]})
df
a b
0 1.0 NaN
1 2.0 NaN
2 3.0 NaN
3 NaN 4.0
4 5.0 NaN
5 NaN 6.0
6 NaN 7.0
이 메서드는 원래 DataFrame을 수정하여 제자리에서 작동합니다.이것은 이 사용 사례에 효율적인 옵션입니다.
df['b'].update(df['a'])
# Or, to update "a" in-place,
# df['a'].update(df['b'])
df
a b
0 1.0 1.0
1 2.0 2.0
2 3.0 3.0
3 NaN 4.0
4 5.0 5.0
5 NaN 6.0
6 NaN 7.0
df['a'].add(df['b'], fill_value=0)
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 6.0
6 7.0
dtype: float64
DataFrame.fillna
+ DataFrame.sum
df.fillna(0).sum(1)
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 6.0
6 7.0
dtype: float64
이 문제가 발생했지만 여러 열에서 첫 번째 null이 아닌 열을 선택하여 여러 열을 병합하고 싶었습니다.저는 다음이 도움이 된다는 것을 알았습니다.
더미데이터구축
import pandas as pd
df = pd.DataFrame({'a1': [None, 2, 3, None],
'a2': [2, None, 4, None],
'a3': [4, 5, None, None],
'a4': [None, None, None, None],
'b1': [9, 9, 9, 999]})
df
a1 a2 a3 a4 b1
0 NaN 2.0 4.0 None 9
1 2.0 NaN 5.0 None 9
2 3.0 4.0 NaN None 9
3 NaN NaN NaN None 999
a1 a2, a3를 새 열 A로 통합합니다.
def get_first_non_null(dfrow, columns_to_search):
for c in columns_to_search:
if pd.notnull(dfrow[c]):
return dfrow[c]
return None
# sample usage:
cols_to_search = ['a1', 'a2', 'a3']
df['A'] = df.apply(lambda x: get_first_non_null(x, cols_to_search), axis=1)
print(df)
a1 a2 a3 a4 b1 A
0 NaN 2.0 4.0 None 9 2.0
1 2.0 NaN 5.0 None 9 2.0
2 3.0 4.0 NaN None 9 3.0
3 NaN NaN NaN None 999 NaN
나는 이런 해결책을 생각하고 있습니다.
def coalesce(s: pd.Series, *series: List[pd.Series]):
"""coalesce the column information like a SQL coalesce."""
for other in series:
s = s.mask(pd.isnull, other)
return s
왜냐하면 열이 있는 DataFrame이 주어졌기 때문입니다.['a', 'b', 'c']
, SQL 통합처럼 사용할 수 있습니다.
df['d'] = coalesce(df.a, df.b, df.c)
NaN은 없지만 동일한 동작을 원하는 보다 일반적인 경우:
'왼쪽'을 병합하되 가능한 경우 '오른쪽' 값을 재정의합니다.
좋은 코드입니다, 파이썬 3에 오타가 있다고 치시면, 이렇게 보입니다.
"""coalesce the column information like a SQL coalesce."""
for other in series:
s = s.mask(pd.isnull, other)
return s
Pandas에서 효율적인 SQL을 위해 DuckDB를 사용하는 것을 고려해 봅니다.성능이 뛰어나고 단순하며 기능이 풍부합니다.https://duckdb.org/2021/05/14/sql-on-pandas.html
샘플 데이터 프레임:
import numpy as np
import pandas as pd
df = pd.DataFrame({'A':[1,np.NaN, 3, 4, 5],
'B':[np.NaN, 2, 3, 4, np.NaN]})
DuckDB를 사용한 연합:
import duckdb
out_df = duckdb.query("""SELECT A,B,coalesce(A,B) as C from df""").to_df()
print(out_df)
출력:
A B c
0 1.0 NaN 1.0
1 NaN 2.0 2.0
2 3.0 3.0 3.0
3 4.0 4.0 4.0
4 5.0 NaN 5.0
언급URL : https://stackoverflow.com/questions/38152389/coalesce-values-from-2-columns-into-a-single-column-in-a-pandas-dataframe
'programing' 카테고리의 다른 글
Wordpress 블로그의 RSS 피드에서 MathJax 사용 (0) | 2023.09.14 |
---|---|
Excel의 열 너비를 R로 정의 (0) | 2023.09.14 |
(WP-CLI) Wordpress-Tests_Lib 파일이 생성되지 않음 (0) | 2023.09.14 |
JAXB: 마샬이 가치를 창출하는 방법 (0) | 2023.09.14 |
어린이를 조롱하는 구성 요소 - 각도 2 (0) | 2023.09.14 |