Python Pandas:无法根据 groupby 在两个不同的列中返回字典

Posted

技术标签:

【中文标题】Python Pandas:无法根据 groupby 在两个不同的列中返回字典【英文标题】:Python Pandas : Unable to return dictionary in two different columns based on groupby 【发布时间】:2020-01-17 05:09:14 【问题描述】:

我有如下数据框,

df1:
  mac            gw_mac         building  rssi type    payload
0 0010403bf0db   b827eb36fb0b   main      -45  iBeacon e2c56db5dffb48d2b060d0f5a71096e0
1 0010403bf0db   d827fc36gc0c   main      -67  other   02010612ff590080bc2c01001d0b3a00000005000000 
2 bf0db0010403   b827eb36fb0b   main      -71  iBeacon e2c56db5dffb48d2b060d0f5a71096e0  
3 bf0db0010403   d827fc36gc0c   main      -59  other   02010612ff590080bc2c01001d0b3a00000005000000

基于“mac”和“building”的组,“gw_mac”和“rssi”的列值必须以“gw_mac_rssi”列的名称作为字典。

同样,基于上述相同的分组条件,“payload”和“type”的列值必须以“payload_type”的名称作为字典框起来,结果数据框应该是,

df2:
  mac             building    gw_mac_rssi                              payload_type
0 0010403bf0db    main        'b827eb36fb0b':-45,'d827fc36gc0c':-67 'e2c56db5dffb48d2b060d0f5a71096e0':'iBeacon','02010612ff590080bc2c01001d0b3a00000005000000':'other'
1 bf0db0010403    main        'b827eb36fb0b':-71,'d827fc36gc0c':-59 'e2c56db5dffb48d2b060d0f5a71096e0':'iBeacon','02010612ff590080bc2c01001d0b3a00000005000000':'other'

我试过了

df.groupby(['mac',  'building']) \
    .apply(lambda x: x.set_index('edge_mac_gw_mac_rssi')['rssi'].to_dict()).apply(lambda x: x.set_index('type')['payload'].to_dict()).reset_index(name=["gw_mac_rssi","payload_type"])

谁能帮助我根据具有多个列值的相同分组条件构建两个不同的字典?

【问题讨论】:

【参考方案1】:

首先让我们看看如何从 groupby 对象中添加一列字典:

df.groupby(['mac','building']).apply(lambda x: dict(zip(x['gw_mac'],x['rssi'])))

那么对于同时生成的两列,我们需要从lambda函数中返回pandas.Series,那么就变成了:

df.groupby(['mac','building']).apply(lambda x: pd.Series([dict(zip(x['gw_mac'],x['rssi'])),
        dict(zip(x['payload'],x['type']))],index=['gw_mac_rssi','payload_type']))

应该会产生想要的结果,不过我没有使用您的输入,使用简单的输入并工作。

【讨论】:

以上是关于Python Pandas:无法根据 groupby 在两个不同的列中返回字典的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:无法根据字符串相等性进行过滤

importpandasaspd的作用

python--pandas删除

Pandas - Python,根据日期列删除行

将价值应用于 Pandas 枢轴级别的所有成员

填补 MultiIndex Pandas Dataframe 中的日期空白