【问题标题】:Subsetting pandas dataframe based on two columnar values基于两个列值的子集熊猫数据框
【发布时间】:2021-05-29 18:34:37
【问题描述】:

我正在尝试根据两列中的唯一值(均为 dtype = object)对大型数据框(5000+ 行和 15 列)进行子集化。我想排除行符合以下条件的数据:

名为“记录”的列等于“MO”AND名为“年份”的列等于“2017”或“2018”。

这是数据框的示例:

df = pd.DataFrame({'A': [1001,2002,3003,4004,5005,6006,7007,8008,9009], 'Record' : ['MO','MO','I','I','MO','I','MO','I','I'], 'Year':[2017,2019,2018,2020,2018,2018,2020,2019,2017]})
print(df)
    A     Record  Year
0  1001     MO  2017
1  2002     MO  2019
2  3003      I  2018
3  4004      I  2020
4  5005     MO  2018
5  6006      I  2018
6  7007     MO  2020
7  8008      I  2019
8  9009      I  2017

我想要从数据框中取出both“MO”和“2017”以及both“MO”和“2018”的任何行。

删除右侧行(上面数据框中的 0 和 4)的示例:

df = pd.DataFrame({'A': [2002,3003,4004,6006,7007,8008,9009], 'Record' : ['MO','I','I','I','MO','I','I'], 'Year':[2019,2018,2020,2018,2020,2019,2017]})
print(df)
     A   Record  Year
0  2002     MO  2019
1  3003      I  2018
2  4004      I  2020
3  6006      I  2018
4  7007     MO  2020
5  8008      I  2019
6  9009      I  2017

我试过下面的代码,但它不起作用(我一开始只尝试了一年):

df = df[(df['Record'] != "MO" & df['Year'] != "2017")]

【问题讨论】:

    标签: sql python-3.x pandas dataframe subset


    【解决方案1】:

    我相信你只是缺少一些括号。

    df = df[(df['Record'] != "MO") & (df['Year'] != "2017")]
    

    编辑: 经过一番澄清:

    df = df[~((df['Record']=='MO')&
              (df['Year']=='2017')|
              (df['Year']=='2018'))]
    

    【讨论】:

    • 谢谢。我也这样做了,但它删除了所有包含“MO”或“2017”的行。我想要做的是删除所有具有“MO”和“2017”以及“MO”和“2018”的行,并保留其他所有内容
    • 谢谢。您的编辑实际上完全删除了一年,但如果它们按以下方式按顺序拆分,它会起作用:``` df = df[~((df['Record']=='MO')& ( df['年份']=='2017'))] ; df = df[~((df['Record']=='MO')& (df['Year']=='2018'))] ```
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2018-04-23
    • 2020-11-18
    • 2017-12-12
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多