过滤熊猫数组

时间:2020-01-13 20:09:54

标签: pandas dataframe

我正在执行这种代码,以查找值是否属于数据帧内的数组a

解决方案1 ​​

df = pd.DataFrame([{'a':[1,2,3], 'b':4},{'a':[5,6], 'b':7},])
df = df.explode('a')
df[df['a'] == 1]

将给出输出:

    a   b
0   1   4

问题

如果有重复,这可能会变得更糟:

df = pd.DataFrame([{'a':[1,2,1,3], 'b':4},{'a':[5,6], 'b':7},])
df = df.explode('a')
df[df['a'] == 1]

将给出输出:

    a   b
0   1   4
0   1   4

解决方案2

另一个解决方案可能是这样:

df = pd.DataFrame([{'a':[1,2,1,3], 'b':4},{'a':[5,6], 'b':7},])
df = df[df['a'].map(lambda row: 1 in row)]

问题

如果数据框很大,则Lambda不能快速运行。

问题

作为第一个目标,我希望值1属于a的所有行:

  • 不使用Python,因为它很慢
  • 高性能
  • 避免出现内存问题
  • ...

因此,我试图了解如何处理Pandas内部的数组。是否有一些有关如何有效使用此类型的文档?

3 个答案:

答案 0 :(得分:0)

IIUC,您正在尝试:

df[df['a'].eq(1).groupby(level=0).transform('any')

输出:

   a  b
0  1  4
0  2  4
0  3  4

答案 1 :(得分:0)

没有错。这是pandas.explode()的正常行为。

要检查某个值是否属于a中的值,可以使用以下方法:

if x in df.a.explode()

其中x是您要测试的内容。

答案 2 :(得分:0)

我认为您可以使用DataFrame构造函数将数组转换为标量,然后使用DataFrame.eqDataFrame.any测试值:

df = df[pd.DataFrame(df['a'].tolist()).eq(1).any(axis=1)]
print (df)
              a  b
0  [1, 2, 1, 3]  4

详细信息

print (pd.DataFrame(df['a'].tolist()))
   0  1    2    3
0  1  2  1.0  3.0
1  5  6  NaN  NaN

print (pd.DataFrame(df['a'].tolist()).eq(1))
       0      1      2      3
0   True  False   True  False
1  False  False  False  False

因此,我试图了解如何处理Pandas内部的数组。是否有一些有关如何有效使用此类型的文档?

我认为在good idea中使用list大熊猫不是这样。