【问题标题】:perform df.loc to groupby df执行 df.loc 到 groupby df
【发布时间】:2021-09-03 10:29:43
【问题描述】:

我有一个df,由人、始发地和目的地组成

df = pd.DataFrame({'PersonID':['1','1','2','2','2','3'],'O':['A','B','C','B','A','X'],'D':['B','A','B','A','B','Y']})

df:

PersonID    O       D
   1        A       B
   1        B       A      
   2        C       B
   2        B       A
   2        A       B
   3        X       Y

我已将 df 与 df_grouped = df.groupby(['O','D']) 分组,并将它们与另一个数据框 taxi 匹配。

TaxiID    O       D
  T1      B       A
  T2      A       B
  T3      C       B

同样,我将taxi 与他们的OD 分组。然后我在聚合和计算每个 O-D 对的 PersonID 和 TaxiID 后合并它们。我这样做是为了看看有多少出租车可供多少人使用。

O     D     PersonID    TaxiID
             count      count
A     B        2          1
B     A        2          1
C     B        1          1

现在,我想执行df.loc 获取合并文件中计数的那些 PersonID。我怎样才能做到这一点?我试过了:

seek = df.loc[df.PersonID.isin(merged['PersonID'])]

但它返回一个空数据框。我该怎么做?

编辑:我使用虚拟数据附上了这个案例的完整代码

df = pd.DataFrame({'PersonID':['1','1','2','2','2','3'],'O':['A','B','C','B','A','X'],'D':['B','A','B','A','B','Y']})
taxi = pd.DataFrame({'TaxiID':['T1','T2','T3'],'O':['B','A','C'],'D':['A','B','B']})

df_grouped = df.groupby(['O','D'])
taxi_grouped = taxi.groupby(['O','D'])

dfm = df_grouped.agg({'PersonID':['count',list]}).reset_index()
tgm = taxi_grouped.agg({'TaxiID':['count',list]}).reset_index()

merged = pd.merge(dfm, tgm, how='inner')

seek = df.loc[df.PersonID.isin(merged['PersonID'])]

【问题讨论】:

  • 你能展示你的完整代码吗?
  • @jezrael 我已经编辑并添加了完整的代码

标签: python pandas dataframe pandas-groupby


【解决方案1】:

为嵌套列表中的标量选择MultiIndex by tupleSeries.explode

seek = df.loc[df.PersonID.isin(merged[('PersonID', 'list')].explode().unique())]
print (seek)
  PersonID  O  D
0        1  A  B
1        1  B  A
2        2  C  B
3        2  B  A
4        2  A  B

为了获得更好的性能,可以使用 set comprehension 和 flatten:

seek = df.loc[df.PersonID.isin(set(z for x in merged[('PersonID', 'list')] for z in x))]
print (seek)
  PersonID  O  D
0        1  A  B
1        1  B  A
2        2  C  B
3        2  B  A
4        2  A  B

【讨论】:

  • 我希望将merged[('PersonID', 'list')].explode().unique() 用于大型数据帧应该会更快。
  • @mozway - 是的,同意。
  • @mozway @jezrael 这些作品完美,谢谢!所以基本上它所做的是将merged['PersonID'] 转换为一个列表,然后df.loc 以该列表作为参考从df 获取数据。我的解释正确吗?
  • @Ricky 你很接近,它是第一个解决方案的 numpy 数组,类似于列表,第二个它被设置用于参考。
猜你喜欢
  • 2020-11-08
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2020-12-18
  • 2023-02-06
  • 2020-11-29
  • 2021-12-24
相关资源
最近更新 更多