我有一个数据帧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()函数,但他们希望输入序列。有没有简单的方法来获得所需的输出?
答案 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 是一个浮点数)