Panda DataFrame에서 빈 셀이 포함된 행을 삭제합니다.
나는 있습니다pd.DataFrame
일부 Excel 스프레드시트를 구문 분석하여 만들었습니다.빈 셀이 있는 열입니다.예를 들어, 아래는 해당 열의 빈도에 대한 출력입니다. 3220 레코드에는 테넌트에 대한 결측값이 있습니다.
>>> value_counts(Tenant, normalize=False)
32320
Thunderhead 8170
Big Data Others 5700
Cloud Cruiser 5700
Partnerpedia 5700
Comcast 5700
SDP 5700
Agora 5700
dtype: int64
테넌트가 누락된 행을 삭제하려고 합니다..isnull()
옵션이 결측값을 인식하지 못합니다.
>>> df['Tenant'].isnull().sum()
0
열에 "개체" 데이터 유형이 있습니다.이 경우에 무슨 일이 일어나고 있습니까?테넌트가 누락된 곳에서 레코드를 삭제하려면 어떻게 해야 합니까?
판다는 값이 null이면 null로 인식합니다.np.nan
객체, 다음과 같이 인쇄됩니다.NaN
데이터 프레임에 있습니다.결측값은 빈 문자열일 수 있으며 Pandas는 이를 null로 인식하지 않습니다.이 문제를 해결하려면 빈 스팅(또는 빈 셀에 있는 모든 항목)을 다음으로 변환할 수 있습니다.np.nan
개체:사용replace()
그리고 나서 전화합니다.dropna()
null 테넌트가 있는 행을 삭제합니다.
증명하기 위해, 우리는 몇 가지 임의의 값과 몇 가지 빈 문자열로 데이터 프레임을 만듭니다.Tenants
열:
>>> import pandas as pd
>>> import numpy as np
>>>
>>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
>>> df['Tenant'] = np.random.choice(['Babar', 'Rataxes', ''], 10)
>>> print df
A B Tenant
0 -0.588412 -1.179306 Babar
1 -0.008562 0.725239
2 0.282146 0.421721 Rataxes
3 0.627611 -0.661126 Babar
4 0.805304 -0.834214
5 -0.514568 1.890647 Babar
6 -1.188436 0.294792 Rataxes
7 1.471766 -0.267807 Babar
8 -1.730745 1.358165 Rataxes
9 0.066946 0.375640
이제 모든 빈 문자열을 교체합니다.Tenants
와의 칼럼.np.nan
다음과 같은 객체:
>>> df['Tenant'].replace('', np.nan, inplace=True)
>>> print df
A B Tenant
0 -0.588412 -1.179306 Babar
1 -0.008562 0.725239 NaN
2 0.282146 0.421721 Rataxes
3 0.627611 -0.661126 Babar
4 0.805304 -0.834214 NaN
5 -0.514568 1.890647 Babar
6 -1.188436 0.294792 Rataxes
7 1.471766 -0.267807 Babar
8 -1.730745 1.358165 Rataxes
9 0.066946 0.375640 NaN
이제 null 값을 삭제할 수 있습니다.
>>> df.dropna(subset=['Tenant'], inplace=True)
>>> print df
A B Tenant
0 -0.588412 -1.179306 Babar
2 0.282146 0.421721 Rataxes
3 0.627611 -0.661126 Babar
5 -0.514568 1.890647 Babar
6 -1.188436 0.294792 Rataxes
7 1.471766 -0.267807 Babar
8 -1.730745 1.358165 Rataxes
Pythonic + 팬터블:df[df['col'].astype(bool)]
빈 문자열은 거짓이며, 이는 다음과 같이 부울 값을 필터링할 수 있음을 의미합니다.
df = pd.DataFrame({
'A': range(5),
'B': ['foo', '', 'bar', '', 'xyz']
})
df
A B
0 0 foo
1 1
2 2 bar
3 3
4 4 xyz
df['B'].astype(bool)
0 True
1 False
2 True
3 False
4 True
Name: B, dtype: bool
df[df['B'].astype(bool)]
A B
0 0 foo
2 2 bar
4 4 xyz
빈 문자열뿐만 아니라 공백만 포함하는 문자열도 제거하는 것이 목표인 경우,str.strip
사전:
df[df['B'].str.strip().astype(bool)]
A B
0 0 foo
2 2 bar
4 4 xyz
생각보다 빠른 속도
.astype
벡터화된 작업으로, 지금까지 제시된 모든 옵션보다 빠릅니다.적어도, 내 테스트로는.YMMV.
여기 타이밍 비교가 있습니다. 제가 생각할 수 있는 몇 가지 다른 방법을 제시했습니다.
참조용 벤치마킹 코드:
import pandas as pd
import perfplot
df1 = pd.DataFrame({
'A': range(5),
'B': ['foo', '', 'bar', '', 'xyz']
})
perfplot.show(
setup=lambda n: pd.concat([df1] * n, ignore_index=True),
kernels=[
lambda df: df[df['B'].astype(bool)],
lambda df: df[df['B'] != ''],
lambda df: df[df['B'].replace('', np.nan).notna()], # optimized 1-col
lambda df: df.replace({'B': {'': np.nan}}).dropna(subset=['B']),
],
labels=['astype', "!= ''", "replace + notna", "replace + dropna", ],
n_range=[2**k for k in range(1, 15)],
xlabel='N',
logx=True,
logy=True,
equality_check=pd.DataFrame.equals)
value_counts는 기본적으로 NaN을 생략하므로 ""를 처리할 가능성이 높습니다.
그래서 그냥 걸러내면 돼요.
filter = df["Tenant"] != ""
dfNew = df[filter]
셀에 빈 공간이 있어서 볼 수 없고, 사용하는 상황이 있습니다.
df['col'].replace(' ', np.nan, inplace=True)
공백을 NaN으로 대체하려면, 다음과 같이 합니다.
df= df.dropna(subset=['col'])
다음 변형을 사용할 수 있습니다.
import pandas as pd
vals = {
'name' : ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7'],
'gender' : ['m', 'f', 'f', 'f', 'f', 'c', 'c'],
'age' : [39, 12, 27, 13, 36, 29, 10],
'education' : ['ma', None, 'school', None, 'ba', None, None]
}
df_vals = pd.DataFrame(vals) #converting dict to dataframe
출력됩니다(** - 원하는 행만 강조 표시).
age education gender name
0 39 ma m n1 **
1 12 None f n2
2 27 school f n3 **
3 13 None f n4
4 36 ba f n5 **
5 29 None c n6
6 10 None c n7
따라서 '교육' 값이 없는 모든 항목을 삭제하려면 아래 코드를 사용하십시오.
df_vals = df_vals[~df_vals['education'].isnull()]
('~'은 아님을 나타냄)
결과:
age education gender name
0 39 ma m n1
2 27 school f n3
4 36 ba f n5
데이터 프레임의 이름을 고려할 때 누락된 파일이 있는 열이 중요하지 않은 경우New
그리고 새로운 데이터 프레임을 동일한 변수에 할당하기를 원하며, 단순히 실행합니다.
New = New.drop_duplicates()
에 있는 빈과 같이 .Tenant
이것이 효과가 있을 것입니다.
New = New[New.Tenant != '']
특정 값을 가진 행을 제거하는 데도 사용할 수 있습니다. 문자열을 원하는 값으로 변경하기만 하면 됩니다.
참고: 빈 문자열 대신 사용할 경우NaN
,그리고나서
New = New.dropna(subset=['Tenant'])
또는 를 사용할 수 있습니다.
결측값이 빈 문자열인 경우:
df.query('Tenant != ""')
이 결값 다같은인 경우
NaN
:df.query('Tenant == Tenant')
(은 (이후작동)) 이후로
np.nan != np.nan
)
빈 문자열 셀이 포함된 csv/tsv 파일에서 데이터를 읽는 사용자는 누구나 이를 NaN 값으로 자동 변환합니다(설명서 참조).이러한 셀이 열 "c2"에 있다고 가정하면, 다음과 같이 셀을 필터링할 수 있습니다.
df[~df["c2"].isna()]
타일 연산자는 비트 단위로 음수를 수행합니다.
언급URL : https://stackoverflow.com/questions/29314033/drop-rows-containing-empty-cells-from-a-pandas-dataframe
'programing' 카테고리의 다른 글
$aggregation 프레임워크에서 개체 찾기 (0) | 2023.06.19 |
---|---|
모든 컨트롤러에 대해 기본 @RestController URI 접두사를 구성하는 방법은 무엇입니까? (0) | 2023.06.19 |
연속 메모리 블록이란 무엇입니까? (0) | 2023.06.19 |
Azure 스토리지에서 ABFSS와 WASBS의 차이점은 무엇입니까? (0) | 2023.06.19 |
ASP.NET 5, .NET Core 및 ASP.NET Core 5의 차이점은 무엇입니까? (0) | 2023.06.19 |