programing

Panda DataFrame에서 빈 셀이 포함된 행을 삭제합니다.

css3 2023. 6. 19. 21:57

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.

여기 타이밍 비교가 있습니다. 제가 생각할 수 있는 몇 가지 다른 방법을 제시했습니다.

enter image description here

참조용 벤치마킹 코드:

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