按数据类型对pandas数据框进行子集筛选

4
我有一个名为df的Pandas数据框,其中有一列,称为A,其中包含多种数据类型。我想选择所有A为特定数据类型的df行。
例如,假设A有类型intstr。我想做类似于df[type(df[A])==int]的操作。
4个回答

4

安装

df = pd.DataFrame({'A': ['hello', 1, 2, 3, 'bad']})

整个列将被赋予dtype Object。如果你只想查找数字值:

pd.to_numeric(df.A, errors='coerce').dropna() 

1    1.0
2    2.0
3    3.0
Name: A, dtype: float64

然而,这也会将浮点数、数字的字符串表示等内容混入其中。如果你真的想查找类型为int的元素,可以使用列表推导式:

df.loc[[isinstance(val, int) for val in df.A], 'A']

1    1
2    2
3    3
Name: A, dtype: object

但是请注意,dtype 仍然是 Object


如果列具有布尔值,则将保留这些值,因为 boolint 的子类。如果您不想要这个行为,则可以使用 type 而不是 isinstance


4

类型 分组

dod = dict(tuple(df.groupby(df['A'].map(type), sort=False)))

设置

df = pd.DataFrame(dict(A=[1, 'one', {1}, [1], (1,)] * 2))

Validation

for t, d in dod.items():
    print(t, d, sep='\n')
    print()

<class 'int'>
   A
0  1
5  1

<class 'str'>
     A
1  one
6  one

<class 'set'>
     A
2  {1}
7  {1}

<class 'list'>
     A
3  [1]
8  [1]

<class 'tuple'>
      A
4  (1,)
9  (1,)

4

使用用户user3483203的groupby数据

for _,x in df.groupby(df.A.apply(lambda x : type(x).__name__)):
    print(x)

   A
1  1
2  2
3  3
       A
0  hello
4    bad

d={ y:x   for y,x in df.groupby(df.A.apply(lambda x : type(x).__name__))}

0
a = [2, 'B',3.0, 'c', 1, 'a', 2.0, 'b',3, 'C', 'A', 1.0]

df = pd.DataFrame({"a": a})

df['upper'] = df['a'].str.isupper()
df['lower'] = df['a'].str.islower()
df['int'] = df['a'].apply(isinstance,args = [int])
df['float'] = df['a'].apply(isinstance,args = [float])

print(df)

    a   upper   lower   int     float
0   2   NaN      NaN    True    False
1   B   True    False   False   False
2   3   NaN      NaN    False   True
3   c   False   True    False   False
4   1   NaN      NaN    True    False
5   a   False   True    False   False
6   2   NaN      NaN    False   True
7   b   False   True    False   False
8   3   NaN      NaN    True    False
9   C   True    False   False   False
10  A   True    False   False   False
11  1   NaN      NaN    False   True

integer = df[df['int']]['a']

print(integer)

0    2
4    1
8    3
Name: a, dtype: object

你的代码可能很有帮助,但最好能解释一下你的答案,你的代码是如何工作的以及为什么很有用。 - Ivanhercaz
@Ivanhercaz是这个答案被你点踩的原因吗?!这段代码并不是一个需要解释的新包或庞大的程序!它本身就很清楚易懂。 - Khalil Al Hooti
嗨@Khalil!首先,是的,这就是我对答案进行负投票的原因。我写评论的原因是为了解释这种情况,因为我以善意地认为你想帮助问这个问题的用户。但这是我进行负投票的标准,如果你有其他标准完全没有问题。负投票并不意味着你是一个坏用户或其他什么!请不要犹豫,我的意图不是干扰或损害你的声誉。我可以进行负投票而不写评论,但我更愿意给你写一份说明,因为这样对你更公平。 - Ivanhercaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接