【问题标题】:How to extract data from a pandas dataframe based upon values of other columns?如何根据其他列的值从熊猫数据框中提取数据?
【发布时间】:2019-08-20 11:55:59
【问题描述】:

我有一个 df=

A= 
[period store  item
1        32     'A'
1        34     'A'
1        32     'B'
1        34     'B'
2        42     'X'
2        44     'X'
2        42     'Y'
2        44     'Y'] 

我想查找某个商品在那个时期内的所有商店 最好在这样的字典中:

dicta = {1: {'A': (32, 34),'B': (32, 34)}, 2: {'X': (42, 44),'Y': (42, 44)}}

为@JEZRAEL 编辑

Actual df
       RTYPE  PERIOD_ID  STORE_ID                            MKT MTYPE  RGROUP  RZF  RXF
0        MKT        317     13178                      Kiosks_11  CELL     NaN  NaN  NaN
1        MKT        306     11437                      Kiosks_11  CELL     NaN  NaN  NaN
2        MKT        306     12236                      Kiosks_11  CELL     NaN  NaN  NaN
3        MKT        312     11024                      Kiosks_11  CELL     NaN  NaN  NaN
4        MKT        307     13010                      Kiosks_11  CELL     NaN  NaN  NaN
5        MKT        307     12723                      Kiosks_11  CELL     NaN  NaN  NaN
6        MKT        306     14218                      Kiosks_11  CELL     NaN  NaN  NaN
7        MKT        306     13547                      Kiosks_11  CELL     NaN  NaN  NaN
8        MKT        316     12396                      Kiosks_11  CELL     NaN  NaN  NaN
9        MKT        306     10778                      Cafes_638  CELL     NaN  NaN  NaN
10       MKT        317     11230                      Kiosks_11  CELL     NaN  NaN  NaN
11       MKT        315     13630                      Kiosks_11  CELL     NaN  NaN  NaN
12       MKT        314     14113                        Bars_13  CELL     NaN  NaN  NaN
13       MKT        314     12089                      Kiosks_11  CELL     NaN  NaN  NaN

这里,PERIOD_ID AND STORE_ID 和 MKT 分别是时期、商店和项目。 @jezrael 建议的编辑将上述 df 的内容返回给我。

d1={306L: (8207L, 8209L .... 8210L, 8211L),307L:( 8215L, 8219L ... 8233L, 8235L), 308: (8238L, 8239L....8244L, 8252L) ..k:(v) ..}

(注意:编辑使其看起来很小,因为原始字典很大)

对于示例数据,它可以按预期正常工作,但对于此数据框却不是。

编辑@jezrael 作为一个最小的、可重现的示例。

df=

   RTYPE  PERIOD_ID    STORE_ID                       MKT MTYPE  RGROUP  RZF  RXF
0    MKT   20171411  3102300001  PM KA+PM PROV+SMKT+PETRO  CELL     NaN  NaN  NaN
1    MKT   20171411  3102300002  PM KA+PM PROV+SMKT+PETRO  CELL     NaN  NaN  NaN
2    MKT   20171411  3104001193              PM Provision  CELL     NaN  NaN  NaN
3    MKT   20171411  3104001193  PM KA+PM PROV+SMKT+PETRO  CELL     NaN  NaN  NaN
4    MKT   20171411  3104001193    Provision including MM  CELL     NaN  NaN  NaN
5    MKT   20171411  3104001641              PM Provision  CELL     NaN  NaN  NaN
6    MKT   20171411  3104001641  PM KA+PM PROV+SMKT+PETRO  CELL     NaN  NaN  NaN
7    MKT   20171411  3104001641    Provision including MM  CELL     NaN  NaN  NaN
8    MKT   20171411  3104001682              PM Provision  CELL     NaN  NaN  NaN
9    MKT   20171411  3104001682  PM KA+PM PROV+SMKT+PETRO  CELL     NaN  NaN  NaN
10   MKT   20171411  3104001682    Provision including MM  CELL     NaN  NaN  NaN
11   MKT   20171412  3104001682                   Alcohol  CELL     NaN  NaN  NaN
12   MKT   20171412  3104001682                      Fish  CELL     NaN  NaN  NaN
13   MKT   20171412  3104001684                   Alcohol  CELL     NaN  NaN  NaN
14   MKT   20171412  3104001684                      Fish  CELL     NaN  NaN  NaN

根据@jezraels 代码的当前输出

{20171411L: ('Provision including MM', 'PM Provision', 'PM KA+PM PROV+SMKT+PETRO'), 20171412L: ('Fish', 'Alcohol')}

预期输出:

{20171411L: ('Provision including MM', 'PM Provision'), 20171412L: ('Fish', 'Alcohol')}

对于 Period 20171411L'Provision including MM'、'PM Provision' MKT 是重复的,因为它们具有相同的 store_id 集,而对于 period 20171412L、'Fish'、'Alcohol' MKT 是重复的,因为它们具有相同的 store_id 集。

我是 Pandas 的新手,但对 Python 有一些基础知识。 真的不知道我怎么能做到这一点。 任何帮助都会很棒。

【问题讨论】:

  • {p: g.groupby('item')['store'].apply(tuple).to_dict() for p, g in df.groupby('period')}

标签: python pandas python-2.7 dataframe


【解决方案1】:

您可以使用 dict 理解:

dicta = {p: g.groupby('item')['store'].apply(tuple).to_dict()
         for p, g in df.groupby('period')}

[出]

{1: {"'A'": (32, 34), "'B'": (32, 34)}, 2: {"'X'": (42, 44), "'Y'": (42, 44)}}

【讨论】:

  • 嗨@Chris A,你能帮我做一件事吗期间完全相同,那么这些项目是重复的。例如:A,B 是重复的,因为它们在期间 1 中具有相同的商店,同样 X,Y 是期间 2 的重复。所以最后我期待这样的输出,dictout={1:(A,B) ,2:(X,Y)}。你能帮忙吗?
【解决方案2】:

创建MultiIndex Series 并在字典理解中创建嵌套字典:

s = df.groupby(['period','item'])['store'].apply(tuple)

d = {level: s.xs(level).to_dict() for level in s.index.levels[0]}
print (d)
{1: {'A': (32, 34), 'B': (32, 34)}, 2: {'X': (42, 44), 'Y': (42, 44)}}

编辑:您可以按period 分组并将item 转换为集合,然后转换为元组:

d1 = {k:tuple(set(v)) for k, v in df.groupby('period')['item']}
print (d1)
{1: ('A', 'B'), 2: ('X', 'Y')}

d1 = df.groupby('period')['item'].apply(lambda x: tuple(set(x))).to_dict()
print (d1)
{1: ('A', 'B'), 2: ('X', 'Y')}

【讨论】:

  • 嗨@jezrael,你能帮我做一件事吗期间完全相同,那么这些项目是重复的。例如:A,B 是重复的,因为它们在期间 1 中具有相同的商店,同样 X,Y 是期间 2 的重复。所以最后我期待这样的输出,dictout={1:(A,B) ,2:(X,Y)}。你能帮忙吗?
  • 谢谢,但您建议的编辑会返回该时期的一组独特的项目,我需要一本时期和项目的字典,它们在该时期是重复的。重复的条件:如果一个项目的商店集合在时期与同一时期的任何其他项目完全相同,那么这两个项目都是重复的。因此,在给定的示例中,A、B 和 X、Y 分别是期间 1 和 2 的重复项,因为它们具有相同的商店。
  • @thebigshaikh - 当然,等一下。
  • @thebigshaikh - 你能测试一下df1 = df[df.duplicated(['period','item'], keep=False)] d1 = {k:tuple(set(v)) for k, v in df1.groupby('period')['item']} 吗?
  • 是的,等一下。
猜你喜欢
  • 2017-06-26
  • 2020-10-21
  • 2023-03-17
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多