Python: Pandas filter string data based on its string length

后端 未结 6 1200
眼角桃花
眼角桃花 2020-12-01 08:35

I like to filter out data whose string length is not equal to 10.

If I try to filter out any row whose column A\'s or B\'s string length is not equal to 10, I tried

相关标签:
6条回答
  • 2020-12-01 09:15
    import pandas as pd
    
    df = pd.read_csv('filex.csv')
    df['A'] = df['A'].astype('str')
    df['B'] = df['B'].astype('str')
    mask = (df['A'].str.len() == 10) & (df['B'].str.len() == 10)
    df = df.loc[mask]
    print(df)
    

    Applied to filex.csv:

    A,B
    123,abc
    1234,abcd
    1234567890,abcdefghij
    

    the code above prints

                A           B
    2  1234567890  abcdefghij
    
    0 讨论(0)
  • 2020-12-01 09:16

    you can use df.apply(len) . it will give you the result

    0 讨论(0)
  • 2020-12-01 09:22

    I personally found this way to be the easiest:

    df['column_name'] = df[df['column_name'].str.len()!=10]
    
    0 讨论(0)
  • 2020-12-01 09:23

    A more Pythonic way of filtering out rows based on given conditions of other columns and their values:

    Assuming a df of:

    data={"names":["Alice","Zac","Anna","O"],"cars":["Civic","BMW","Mitsubishi","Benz"],
         "age":["1","4","2","0"]}
    
    df=pd.DataFrame(data)
    df:
      age        cars  names
    0   1       Civic  Alice
    1   4         BMW    Zac
    2   2  Mitsubishi   Anna
    3   0        Benz      O
    

    Then:

    df[
    df['names'].apply(lambda x: len(x)>1) &
    df['cars'].apply(lambda x: "i" in x) &
    df['age'].apply(lambda x: int(x)<2)
      ]
    

    We will have :

      age   cars  names
    0   1  Civic  Alice
    

    In the conditions above we are looking first at the length of strings, then we check whether a letter ("i") exists in the strings or not, finally, we check for the value of integers in the first column.

    0 讨论(0)
  • 2020-12-01 09:25

    Filter out values other than length of 10 from column A and B, here i pass lambda expression to map() function. map() function always applies in Series Object.

     df = df[df['A'].map(lambda x: len(str(x)) == 10)]
     df = df[df['B'].map(lambda x: len(str(x)) == 10)]
    
    0 讨论(0)
  • 2020-12-01 09:28

    If You have numbers in rows, then they will convert as floats.

    Convert all the rows to strings after importing from cvs. For better performance split that lambdas into multiple threads.

    0 讨论(0)
提交回复
热议问题