【问题标题】:how to apply condition in pandas but only for finite number of rows?如何在熊猫中应用条件但仅适用于有限数量的行?
【发布时间】:2021-01-07 07:52:32
【问题描述】:

我有一个多索引熊猫表,如下所示。

我想更新 Crop 和 Avl 列,比如“番茄”和“0”,但仅限于有限的次数(比如,我只需要 10 行番茄,满足一个条件)。目前通过 pandas,我最终会更新所有满足该条件的行。

col1 = ildf1.index.get_level_values(1) # https://stackoverflow.com/a/50608928/9148067
cond = col1.str.contains('DN_Mega') & (ildf1['Avl'] == 1)

ildf1.iloc[ cond , [0,2]] = ['Tomato', 0]

我如何限制它只说满足条件的所有行中的 10 行?

PS:我使用了get_level_values,因为我的 df 中有 4 列(GR、PP+MT、Bay、Row)多索引。

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    对于如下定义的df,您需要添加额外的索引来计算所有具有不同数字的行,然后您可以根据切片设置新的值。给你=^..^=

    import pandas as pd
    
    
    df = pd.DataFrame({'Crop': ['', '', '', '', ''], 'IPR': ['', '', '', '', ''], 'Avi': [1, 2, 3, 4, 5]}, index=[['0','0', '8', '8', '8'], ['6', '7', '7', '7', '7']])
    
    # add additional index
    df['id'] = [x for x in range(0, df.shape[0])]
    df.set_index('id', append=True, inplace=True)
    
    # select only two values based on condition
    condition = df.index[df.index.get_level_values(0).str.contains('8')][0:2]
    df.loc[condition, ['Crop', 'IPR']] = ['Tomato', 0]
    

    输出:

              Crop IPR  Avi
        id                 
    0 6 0                 1
      7 1                 2
    8 7 2   Tomato   0    3
        3   Tomato   0    4
        4                 5
    

    【讨论】:

    • 这应该可以工作,测试它,顺便说一句,我们不能这样做是多索引的限制吗?我认为多索引在反汇编时只是显示为合并的指定列的重复行,但实际上仍然是分开的。
    • @Parthiban Rajendran 在 Pandas 中,您没有定义行数来填充索引相同的多索引上的数据,这就是为什么您需要添加额外的索引来处理这个问题。另一种解决方案是禁用多索引并使用列数据。
    • 哪个更快?
    • @Parthiban Rajendran 我认为以上
    • 在第一种方法中,完成工作后,我尝试删除该 id 列,但这也会丢失所有多索引列。我做了df.reset_index(drop=True, inplace=True)。其次,我使用df.reset_index(level=['GR','PP+MT','Bay']) 禁用了 MI,但现在如何在操作后恢复 MI?在这两种情况下,如果您可以展示如何在可能的情况下在操作后恢复到原始 df,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2017-09-10
    • 2021-05-20
    • 2018-05-03
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多