如何根据其他列的值从数据帧中提取数据?

2024-09-30 06:24:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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、STORE和MKT分别是PERIOD、STORE和items。 @jezrael建议的编辑正在返回我上面的df。你知道吗

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

(注:编辑使其看起来很小,因为原来的词典很大)

对于示例数据,它工作正常,但对于这个数据帧,它不是。你知道吗

编辑@jezrael作为一个最小的,可复制的例子。你知道吗

数据框=

   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是重复的,因为它们具有相同的存储标识集,而对于期间 20171412L,“鱼”,“酒”市场是重复的,因为它们有相同的商店标识集。你知道吗

我刚接触熊猫,但对Python有一些基本的了解。 我真的不知道如何才能做到这一点。 任何帮助都会很好。你知道吗


Tags: id编辑cellnanperiodmmincludingka
2条回答

你可以通过听写理解:

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)}}

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

相关问题 更多 >

    热门问题