【问题标题】:python - comparing series/dataframe with multi-index dataframepython - 将系列/数据帧与多索引数据帧进行比较
【发布时间】:2016-10-17 00:33:16
【问题描述】:

我想将具有单个非唯一索引 (df1) 的数据帧的一列中的值与另一个数据帧 (df2) 的值进行比较(即 > 或 df1 中的值与df2 中的每个值与第一级的相应索引值相匹配。

例如如果 df1 中的值小于 df2 中第一级索引与 df1 中值的索引匹配的任何值,则结果应显示“True”。 一个示例代码将说明这一点

index_a = [1,2,2,3,3,3]
index_b = [0,0,1,0,1,2]
index = pd.MultiIndex.from_arrays([index_a,index_b], names=('a','b'))
df1 = pd.DataFrame(np.random.rand(4,), index = [1,2,3,3], columns=['p'])    
>>> df1
          p
a          
1  0.672379
2  0.130578
3  0.128918
3  0.346115

df2 = pd.DataFrame(np.random.rand(6,), index=index, columns=['p'])
>>> df2
            p
a b          
1 0  0.187448
2 0  0.596792
  1  0.075301
3 0  0.784842
  1  0.256178
  2  0.691007

我想要的可以如下实现:

dfexp = df2.unstack('b')
>>> dfexp
          p                    
b         0         1         2
a                              
1  0.187448       NaN       NaN
2  0.596792  0.075301       NaN
3  0.784842  0.256178  0.691007

>>> comp = dfexp.ge(df1.p,axis=0)
>>> comp
       p              
b      0      1      2
a                     
1  False  False  False
2   True  False  False
3   True   True   True
3   True  False   True
>>> comp.any(axis=1)
a
1    False
2     True
3     True
3     True
dtype: bool

可以在不取消堆叠df2 的情况下实现这一点吗? 问题是,对于某些一级索引,二级标签可能非常大,这使得操作非常缓慢并且expdf 数据框不必要地大。同时df1 的索引也可能非常大,因此我想避免通过循环该索引来解决任务,除非该循环可以非常非常快。

【问题讨论】:

  • df2 = pd.DataFrame(data, index=index, columns=['p']) data 是什么?
  • 我们如何创建dataindex 来形成df2
  • 抱歉信息缺失。我编辑了帖子。
  • 请将此np.random.seed([3,1415]) 添加到df1 分配的正上方的一行中。这将确保我们得到相同的随机数。

标签: python loops numpy pandas


【解决方案1】:

设置

index_a = [1,2,2,3,3,3]
index_b = [0,0,1,0,1,2]
index = pd.MultiIndex.from_arrays([index_a,index_b], names=('a','b'))
np.random.seed(3)
df1 = pd.DataFrame(np.random.rand(4,), index = [1,2,3,3], columns=['p'])
df2 = pd.DataFrame(np.random.rand(6,), index=index, columns=['p'])

试试:

df1.apply(lambda x: (df2.loc[x.name, 'p'] > x.get_value('p')).any(), axis=1)

1     True
2     True
3     True
3    False
dtype: bool

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 2021-12-24
    • 2020-12-21
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多