从熊猫中混合数据类型的列中仅选择整数

时间:2018-12-16 06:27:41

标签: python python-3.x pandas dataframe

我有一个数据帧df,如下所示。 col2列具有空值,空白值,整数甚至浮点值。我想从new_df派生一个新的数据帧df,其中列col2仅具有整数值。

import pandas as pd
import numpy as np

col1 = ["a", "b", "c", "d", "e", "f", "g", "h"]
col2 = ["25.45", "", "200", np.nan, "N/A", "null", "35", "5,300"]

df = pd.DataFrame({"col1": col1, "col2": col2})

df的外观如下:

  col1   col2
0    a  25.45
1    b       
2    c    200
3    d    NaN
4    e    N/A
5    f   null
6    g     35
7    h  5,300

下面是我对new_df的期望输出,其中列col2的值只是整数:

  col1   col2  
2    c    200
6    g     35

我尝试使用pd.to_numeric()甚至isdigit()函数,但他们希望输入序列。有没有简单的方法来获得所需的输出?

2 个答案:

答案 0 :(得分:2)

str.isdigit

过滤出数字并通过布尔索引选择:

df2 = df[df.col2.astype(str).str.isdigit()]    
print(df2)
  col1 col2
2    c  200
6    g   35

P.S。,要将“ col2”转换为整数,请使用

df2['col2'] = df2['col2'].astype(int)

str.contains

您也可以使用str.contains,尽管速度较慢,因为它使用了正则表达式。

df[df.col2.astype(str).str.contains(r'^\d+$')]

  col1 col2
2    c  200
6    g   35

pd.to_numeric

第三个解决方案有些怪异,但使用pd.to_numeric。我们需要执行一个替换前步骤,以过滤掉浮动内容。

v = df.col2.astype(str).str.replace('.', '|', regex=False)
df[pd.to_numeric(v, errors='coerce').notna()]

  col1 col2
2    c  200
6    g   35

答案 1 :(得分:0)

回答同样的问题,但数据略有不同;假设我们有相同的数据框,但现在有第三列,其中有一列包含字符串、整数和浮点数(包括 np.nan)。

import pandas as pd
import numpy as np

col1 = ["a", "b", "c", "d", "e", "f", "g", "h"]
col2 = ["25.45", "", "200", np.nan, "N/A", "null", "35", "5,300"]
col3 = [25.45, "", 200, np.nan, "N/A", "null", 35, "5,300"] # new column with mixed types

df = pd.DataFrame({"col1": col1, "col2": col2, "col3": col3})
print(df)


    col1    col2    col3
0   a       25.45   25.45
1   b       
2   c       200     200
3   d       NaN     NaN
4   e       N/A     N/A
5   f       null    null
6   g       35      35
7   h       5,300   5,300

只选择整数:

df2 = df.loc[df.col3.apply(lambda x : isinstance(x, int))]
print(df2)

    col1    col2    col3
2   c       200     200
6   g       35      35

而且只是浮动:

df3 = df.loc[df.col3.apply(lambda x : isinstance(x, float))]
print(df3)


    col1    col2    col3
0   a       25.45   25.45
3   d       NaN     NaN

(注意 np.nan 是一个浮点数)