如何基于其他列的值从熊猫数据框中提取数据?

时间:2019-08-20 11:55:59

标签: python pandas python-2.7 dataframe

我有一个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和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')}

对于期间 20171411L “包括MM的规定”,“ PM规定” ,MKT是重复的,因为它们具有相同的store_id集 20171412L ,“鱼”,“酒精” MKT是重复的,因为它们具有相同的store_id集。

我是Pandas的新手,但是对Python有一些基本的了解。 真的不确定我如何实现这一目标。 任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

创建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')}

答案 1 :(得分: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)}}