在 Pandas 中同时对 2 列进行逻辑运算

Do logical operations in 2 column simmultaneously in Pandas

我有一个数据框名称 df -

   id   year    month      target1  
0  324  2019.0  1.0        100.0    
1  325  2019.0  3.0        100.0   
2  326  2019.0  10.0       100.0    
3  327  2019.0  11.0       100.0    
4  328  2019.0  12.0       100.0   

现在我想比较数据框的 2 列,即 'year' 和 'month',以获得这样的新数据框 -

   id   year    month      amount  
0  324  2019.0  1.0        100.0    
1  325  2019.0  3.0        100.0   
2  326  2019.0  10.0       100.0    

这里的操作是 -

year <= 2019
&
month <= 10

如何在 Pandas 中实现此目的。

类似的操作可能是 -

year < 2019     &      month <= 6
year < 2019     &      month <  6
year < 2019     &      month <= 12

使用 Python3 或 Pandas 实现此结果的任何逻辑或方法。 我尝试了一种逻辑,我只是​​简单地分别比较年和月,就像这样 -

df_new = df[df['year'] <= year ]
df_new = df_new[df_new['month_num'] <= month_num ]  

但是如果我有超过 1 年的时间,这个逻辑就会失败。通过这个我得到这个数据框作为输出 -

year <= 2020  &  month <= 1
   id year    month      amount 
0  3  2019.0  1.0        100.0     
5  9  2020.0  1.0        100.0     

但理想情况下我需要的是这个 -

   year    month      target1 
0  2019.0  1.0        100.0     
1  2019.0  3.0        100.0     
2  2019.0  10.0       100.0     
3  2019.0  11.0       100.0     
4  2019.0  12.0       100.0     
5  2020.0  1.0        100.0    

谢谢

IIUC 您希望应用两个条件,如 df['condition1' AND 'condition2']。如果是这样,这可能有效:

df1 = df.loc[df['year'] <= 2019].loc[df['month'] <= 10]

我用这个数据集试过(多年):

'''
   id   year    month      target1  
0  324  2019.0  1.0        100.0
1  325  2019.0  3.0        100.0
2  326  2019.0  10.0       100.0
3  327  2019.0  11.0       100.0
5  328  2020.0  4.0       100.0
6  329  2020.0  12.0       100.0
7  330  2020.0  2.0       100.0
'''

df1 的输出:

    id    year  month  target1
0  324  2019.0    1.0    100.0
1  325  2019.0    3.0    100.0
2  326  2019.0   10.0    100.0

如果我将年份的条件更改为:

df1 = df.loc[df['year'] <= 2020].loc[df['month'] <= 10]

输出:

    id    year  month  target1
0  324  2019.0    1.0    100.0
1  325  2019.0    3.0    100.0
2  326  2019.0   10.0    100.0
5  328  2020.0    4.0    100.0
7  330  2020.0    2.0    100.0

您可以尝试这样的简单条件:

df['year'] = df['year'].astype(int)
df['month'] = df['month'].astype(int)

df = df[(df['year'] == 2019) & (df['month'] < 10)]

   id  year  month  target1
0  324  2019      1    100.0
1  325  2019      3    100.0

据我了解,您想在指定年份的指定月份之前打印所有内容。这可以通过多种方式完成

  1. 只需添加
data.query('(year == 2020 and month <= 1) or (year <= 2020)')
  1. 您可以尝试创建一个新列,它将使用 pd.to_datetime()