【问题标题】:Finding unique records in pandas with multiple column combination使用多列组合在 pandas 中查找唯一记录
【发布时间】:2017-09-21 06:22:12
【问题描述】:

假设我有这个 pandas 数据框,

df

street_id district_id region_id value1 value2 
   1          6          8        7      5
   1          5          8        9      3
   2          6          5        8      0
   2          6          5        6      2
   3          4          8        5      1
   3          7          9        0      2

预期输出是,

street_id district_id region_id
   2          6          5            
   3          4          8       
   3          7          9   

我只想选择区域内唯一的街道记录。我不能只找到 street_id 和 region_id 的唯一性,因为我也需要 District_id。我该怎么做?

这里街道的独特性是指一条街道仅存在于一个地区的一个区域内。

【问题讨论】:

  • 输出是否正确?你能解释更多吗?
  • 是的,它是正确的,我想要的是一个地区的独特街道,但有它的 District_id。

标签: python pandas unique


【解决方案1】:

IIUC:

In [15]: df.assign(x=df.groupby(['region_id','street_id'])['district_id'] 
                       .transform('nunique')) \
    ...:   .query("x == 1") \
    ...:   .drop_duplicates(subset=['street_id','region_id']) \
    ...:   .drop('x',1)
Out[15]:
   street_id  district_id  region_id  value1  value2
2          2            6          5       8       0
4          3            4          8       5       1
5          3            7          9       0       2

proposed by @Zero 更好更短的版本:

df[df.groupby(['region_id','street_id'])['district_id']
     .tran‌​sform('nunique').eq(‌​1)] \
  .drop_duplicates(‌​subset=['street_id',‌​'region_id'])

分解:

In [16]: df.groupby(['region_id','street_id'])['district_id'].transform('nunique')
Out[16]:
0    2
1    2
2    1
3    1
4    1
5    1
Name: district_id, dtype: int64

In [17]: df.assign(x=df.groupby(['region_id','street_id'])['district_id'].transform('nunique'))
Out[17]:
   street_id  district_id  region_id  value1  value2  x
0          1            6          8       7       5  2
1          1            5          8       9       3  2
2          2            6          5       8       0  1
3          2            6          5       6       2  1
4          3            4          8       5       1  1
5          3            7          9       0       2  1

In [18]: df.assign(x=df.groupby(['region_id','street_id'])['district_id'].transform('nunique')) \
    ...:   .query("x == 1") \
    ...:
Out[18]:
   street_id  district_id  region_id  value1  value2  x
2          2            6          5       8       0  1
3          2            6          5       6       2  1
4          3            4          8       5       1  1
5          3            7          9       0       2  1

In [19]: df.assign(x=df.groupby(['region_id','street_id'])['district_id'].transform('nunique')) \
    ...:   .query("x == 1") \
    ...:   .drop_duplicates(subset=['street_id','region_id']) \
    ...:
Out[19]:
   street_id  district_id  region_id  value1  value2  x
2          2            6          5       8       0  1
4          3            4          8       5       1  1
5          3            7          9       0       2  1

【讨论】:

  • 好的,问题来了,它不应该返回 street_id = 1,因为它存在于同一地区的多个地区。
  • 让我检查一下完整的数据集。谢谢。
  • 你能解释一下这里发生了什么吗?这将有助于学习。 @MaxU
  • @ds_user,IMO 理解它的最简单方法是将其分解为步骤并检查结果......
  • 不需要assigndropdf[df.groupby(['region_id','street_id'])['district_id'].transform('nunique').eq(1)].drop_duplicates(subset=['street_id','region_id'])
猜你喜欢
  • 2023-04-07
  • 2018-11-05
  • 2021-12-27
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2018-04-05
相关资源
最近更新 更多