【问题标题】:How to extract the Data for give two columns condition in pandas如何在熊猫中提取数据以给出两列条件
【发布时间】:2020-04-20 22:51:49
【问题描述】:
   dept_ID Year_join  salary  present
1     ID1     2000   10000   0 
2     ID1     2001   10000   0
3     ID1     2002   10000   0
4     ID1     2003   10000   0
5     ID1     2004   10000   1
6     ID2     2000   20000   0
7     ID2     2001   20000   1
8     ID2     2002   20000   0
9     ID3     2000   15000   1
10    ID1     2000   10000   0
11    ID1     2001   10000   0
12    ID1     2002   10000   0
13    ID1     2003   10000   0
14    ID1     2004   10000   0
15    ID2     2000   20000   1
16    ID2     2001   20000   0
17    ID2     2002   20000   0
18    ID3     2000   15000   0 
19    ID1     2000   10000   1
20    ID1     2001   10000   0

我想要提取至少一次为 1 的所有部门 ID 的数据,如果我想要 500 个唯一的 dept_id 数据。 我已经尝试了下面的代码,但没有得到想要的输出。

dept_sub=df.dropna(subset=['dept_ID'])
df_1 = dept_sub[dept_sub['present'].isin(['1'])].copy()
s = df.groupby('dept_ID')['present'].nunique()
department = s.index[s.eq(1)].unique()
final_data = dept_sub[dept_sub['dept_ID'].isin(department)]

这是想要的输出

  dept_ID Year_join  salary  present
1     ID1     2000   10000   0 
2     ID1     2001   10000   0
3     ID1     2002   10000   0
4     ID1     2003   10000   0
5     ID1     2004   10000   1
6     ID2     2000   20000   0
7     ID2     2001   20000   1
8     ID2     2002   20000   0
9     ID3     2000   15000   1
10    ID1     2000   10000   0
11    ID1     2001   10000   0
12    ID1     2002   10000   0
13    ID1     2003   10000   0
14    ID1     2004   10000   0
16    ID2     2001   20000   0
17    ID2     2002   20000   0
18    ID3     2000   15000   0 
20    ID1     2001   10000   0

这是 20 行的样本数据。实际上,我的数据集形状是 (500000,50) 我想提取所有 500 个 dept_id 的数据,其中包含至少一个当前值 ==1 并且该 dept_ID 的其余当前值 ==0

【问题讨论】:

  • 给定输入的期望输出是什么?
  • @G. Anderson 我已经编辑了问题,您可以看到所需的输出

标签: python pandas group-by


【解决方案1】:

如果present 中的值是整数过滤行,boolean indexing 中带有Series.eq,则只获取DataFrame.duplicated 的第一个值并添加所有False 以获得与原始长度相同的掩码,因此可以通过以下方式过滤掉它们反掩码~:

mask = (df[df['present'].eq(1)]
             .duplicated(subset=['dept_ID'])
             .reindex(df.index, fill_value=False))

如果present 中的值是字符串:

mask = (df[df['present'].eq('1')]
             .duplicated(subset=['dept_ID'])
             .reindex(df.index, fill_value=False))

df = df[~mask]
print (df)
   dept_ID  Year_join  salary  present
1      ID1       2000   10000        0
2      ID1       2001   10000        0
3      ID1       2002   10000        0
4      ID1       2003   10000        0
5      ID1       2004   10000        1
6      ID2       2000   20000        0
7      ID2       2001   20000        1
8      ID2       2002   20000        0
9      ID3       2000   15000        1
10     ID1       2000   10000        0
11     ID1       2001   10000        0
12     ID1       2002   10000        0
13     ID1       2003   10000        0
14     ID1       2004   10000        0
16     ID2       2001   20000        0
17     ID2       2002   20000        0
18     ID3       2000   15000        0
20     ID1       2001   10000        0

【讨论】:

  • 我正在使用它,但它返回给我的所有数据不是我提到的 data2 = pd.concat([data.chassis_id, data1], axis=1) mask = (data2[data2['target' ].eq('1')].duplicated(subset=['chassis_id']).reindex(data2.index, fill_value=False)) data2 = data2[~mask] print(data2)
  • @jezael 有真实数据。
  • @jezael 如何用真实数据解决这个问题?你能帮帮我吗?
  • @Anki - 很难回答为什么不使用真实数据,你能改变样本数据看看有什么问题吗?
  • @jezael 我想向您展示完整的数据集,但列名很大,数据集形状为 (300000,52)。如何向您展示真实的数据集。
猜你喜欢
  • 2018-09-25
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
相关资源
最近更新 更多