从pandas.DataFrame中选择包含数组的单元格进行成员测试

1 投票
1 回答
544 浏览
提问于 2025-04-17 18:57

这个问题是我之前一个问题的第二部分,您可以查看这里

比如我有一个这样的数据框(DF):

df = pd.DataFrame({
    'A': [[e for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)],
    'B': [[e*10 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)],
    'C': [[e*100 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)]
})

              A                B                   C
0     [1, 2, 3]     [10, 20, 30]     [100, 200, 300]
1     [4, 5, 6]     [40, 50, 60]     [400, 500, 600]
2     [7, 8, 9]     [70, 80, 90]     [700, 800, 900]
3  [10, 11, 12]  [100, 110, 120]  [1000, 1100, 1200]
4  [13, 14, 15]  [130, 140, 150]  [1300, 1400, 1500]

我需要找到一行,其中 'A' 包含数字10。
现在我使用的是:

f = lambda x: 10 in x
mask = df['A'].apply(f)
df[mask] 

我想问的问题是:

  • 这种通过成员测试来获取数据的方法可以吗?有没有更好的方法?
  • 在数据框的单元格中放置列表(和集合)可以吗?

1 个回答

1

你最好使用多重索引的框架来构建数据。这种方式要快得多,因为这些是底层数据的原生类型(提示:你可以在你的框架上使用 df.dtypes 命令,它们会显示为对象类型)

In [3]: A = pd.DataFrame([[e for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)])

In [4]: B = pd.DataFrame([[e*10 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)])

In [5]: C = pd.DataFrame([[e*100 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)])

# this creates a 2-level hierarchy
In [9]: df = pd.concat([A,B,C],keys=['A','B','C'],axis=1)

Out[8]: 
    A            B               C            
    0   1   2    0    1    2     0     1     2
0   1   2   3   10   20   30   100   200   300
1   4   5   6   40   50   60   400   500   600
2   7   8   9   70   80   90   700   800   900
3  10  11  12  100  110  120  1000  1100  1200
4  13  14  15  130  140  150  1300  1400  1500

# select out A
In [14]: df['A']
Out[14]: 
    0   1   2
0   1   2   3
1   4   5   6
2   7   8   9
3  10  11  12
4  13  14  15

# this is a boolean array
In [11]: df['A']>10
Out[11]: 
       0      1      2
0  False  False  False
1  False  False  False
2  False  False  False
3  False   True   True
4   True   True   True

选择特定的切片

In [26]: df.ix[:,('A',1)]
Out[26]: 
0     2
1     5
2     8
3    11
4    14
Name: (A, 1), dtype: int64

撰写回答