Python 如何根据其他列的值从数据帧中提取数据?
我有一个df=Python 如何根据其他列的值从数据帧中提取数据?,python,pandas,python-2.7,dataframe,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),
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分别是PERIOD、STORE和items。
@jezrael建议的编辑将上述df返回给我
d1={306L: (8207L, 8209L .... 8210L, 8211L),307L:( 8215L, 8219L ... 8233L, 8235L), 308: (8238L, 8239L....8244L, 8252L) ..k:(v) ..}
(注意:由于原始词典很大,编辑后的词典看起来很小)
对于示例数据,它工作正常,但对于此数据帧,情况并非如此
将@jezrael作为一个最小的、可复制的示例进行编辑
df=
电流输出符合@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是重复的,因为它们具有相同的存储ID集,而对于期间
20171412L,“鱼”、“酒”市场是重复的,因为它们具有相同的存储ID集
我刚接触熊猫,但对Python有一些基本的了解。
我真的不知道如何才能做到这一点。
任何帮助都会很好。创建
多索引系列
并在字典理解中创建嵌套字典:
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)}}
编辑:您可以按期间
分组,并将项
转换为集合,然后转换为元组:
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')}
你可以通过听写理解:
dicta = {p: g.groupby('item')['store'].apply(tuple).to_dict()
for p, g in df.groupby('period')}
[外]
{p:g.groupby('item')['store'].apply(tuple).to_dict()for p,g in df.groupby('period')}
Hi@jezrael,你能帮我做一件事吗,在同一个数据框A中,我需要在此基础上找到重复项,如果项目wrt到periods的存储集完全相同,那么这些项就是重复项。对于ex: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)),df1中的k,v.groupby('period')['item']}
?是的,请稍等一下。你好@Chris A,你能帮我再做一件事吗,在同一个数据框A中,在这个问题中,我需要基于此找到重复项,如果项目wrt到周期的存储集完全相同,那么这些项目是重复项。对于ex:A,B是重复的,因为它们在时段1中具有相同的存储,同样地,X,Y是时段2的重复。最后,我希望得到这样的输出,dictout={1:(A,B),2:(X,Y)}。你能帮忙吗?
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)}}