当前位置: 首页 > 面试题库 >

Pandas:根据条件为多索引数据框的子集设置值的正确方法

唐法
2023-03-14
问题内容

我不确定如何在没有链接分配的情况下执行此操作(由于我要设置副本,因此这可能无法正常工作)。

我不想采用多索引熊猫数据框的子集,测试小于零的值并将其设置为零。

例如:

df = pd.DataFrame({('A','a'): [-1,-1,0,10,12],
                   ('A','b'): [0,1,2,3,-1],
                   ('B','a'): [-20,-10,0,10,20],
                   ('B','b'): [-200,-100,0,100,200]})

df[df['A']<0] = 0.0

In [37]:

df

Out[37]:
    A   B
    a   b   a   b
0   -1  0   -20 -200
1   -1  1   -10 -100
2   0   2   0   0
3   10  3   10  100
4   12  -1  20  200

这表明它无法根据条件进行设置。或者,如果我进行了链接分配:

df.loc[:,'A'][df['A']<0] = 0.0

这给出了相同的结果(以及带有复制警告的设置)

我可以根据第一级是我想要的条件来遍历每一列:

for one,two in df.columns.values:
    if one == 'A':
        df.loc[df[(one,two)]<0, (one,two)] = 0.0

这给出了预期的结果:

In [64]:

df

Out[64]:
    A   B
    a   b   a   b
0   0   0   -20 -200
1   0   1   -10 -100
2   0   2   0   0
3   10  3   10  100
4   12  0   20  200

但是以某种方式,我觉得有比遍历各列更好的方法。在熊猫中做到这一点的最佳方法是什么?


问题答案:

这是的应用程序(也是使用MultiIndex Slicers的主要动机之一),请参见此处的文档

In [20]: df = pd.DataFrame({('A','a'): [-1,-1,0,10,12],
                   ('A','b'): [0,1,2,3,-1],
                   ('B','a'): [-20,-10,0,10,20],
                   ('B','b'): [-200,-100,0,100,200]})

In [21]: df
Out[21]: 
    A      B     
    a  b   a    b
0  -1  0 -20 -200
1  -1  1 -10 -100
2   0  2   0    0
3  10  3  10  100
4  12 -1  20  200

In [22]: idx = pd.IndexSlice

In [23]: mask = df.loc[:,idx['A',:]]<0

In [24]: mask
Out[24]: 
       A       
       a      b
0   True  False
1   True  False
2  False  False
3  False  False
4  False   True

In [25]: df[mask] = 0

In [26]: df
Out[26]: 
    A      B     
    a  b   a    b
0   0  0 -20 -200
1   0  1 -10 -100
2   0  2   0    0
3  10  3  10  100
4  12  0  20  200

由于您使用的是列索引的第一级,因此以下内容也将适用。上面的示例更为笼统,说您想对“ a”执行此操作。

In [30]: df[df[['A']]<0] = 0

In [31]: df
Out[31]: 
    A      B     
    a  b   a    b
0   0  0 -20 -200
1   0  1 -10 -100
2   0  2   0    0
3  10  3  10  100
4  12  0  20  200


 类似资料:
  • 想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。 我有许多属性分布在许多类中。这些属性的值需要根据许多条件进行分配(每个属性大约有5到8个值)。我正在为众多的“如果”条件寻找一个替代方案。 我很晚才遇到“规则引擎”,但AFAIK可以用来验证规则。 任何设计建议都会有很大帮助。

  • 我想在指定的时间戳范围内从数据帧中选择行的子集。 下面是我所做的,但它似乎没有工作。我正在尝试选择发生在01/01/2019 01:00和01/01/2021 01:00之间的行子集。 非常感谢。

  • 问题内容: 我有一个带有多个列以及一个日期列的数据框。日期格式为15年12月31日,我将其设置为日期时间对象。 我将datetime列设置为索引,并希望对数据框的每个月执行回归计算。 我相信实现此目的的方法是将数据框基于月份拆分为多个数据框,存储到数据框列表中,然后对列表中的每个数据框执行回归。 我使用过groupby可以按月成功拆分数据框,但是不确定如何正确地将groupby对象中的每个组转换为

  • 问题内容: 摘要:这不起作用: 但是这样做: 为什么? 再生产: 这不起作用: 但是这样做: 链接到笔记本 我的问题是: 为什么只有第二种方式起作用?我似乎看不到选择/索引逻辑的差异。 版本是0.10.0 编辑:这不应该再这样了。从0.11版开始,提供。参见此处:http : //pandas.pydata.org/pandas- docs/stable/indexing.html 问题答案: 大

  • 问题内容: 假设我有一个像这样的数据框 原始表更加复杂,具有更多的列和行。 我想获得满足某些条件的第一行。例子: 获取A> 3的第一行(返回第2行) 获取A> 4 AND B> 3的第一行(返回第4行) 获取第一行,其中A> 3 AND(B> 3 OR C> 2)(返回第2行) 但是,如果没有满足特定条件的行,那么我想在我按A降序排序(或者其他情况下按B,C等排序)后得到第一行 获取A> 6的第一

  • 基于单个值/标签的切片 基于一个或多个级别的多个标签的切片 布尔条件和表达式的过滤 哪些方法适用于什么情况 为简单起见的假设: 输入数据表没有重复的索引键 下面的输入数据只有两个级别。(此处所示的大多数解决方案都概括为N个级别) 问题2b 我如何获得级别“二”中对应于“t”和“w”的所有值? 如何从检索横截面,即具有索引特定值的单行?具体来说,如何检索的横截面,由 如何选择与和相对应的两行?