Pandas 如何在大熊猫身上做一个带计数的vlookup
我有以下两个输入数据帧:Pandas 如何在大熊猫身上做一个带计数的vlookup,pandas,merge,count,pivot,vlookup,Pandas,Merge,Count,Pivot,Vlookup,我有以下两个输入数据帧: df_item_in_cat a b c d 0 A A B A 1 B B E B 2 C E F E 3 D F G G df_charac_by_cat cat charac 0 a 10 1 b 20 2 c
df_item_in_cat
a b c d
0 A A B A
1 B B E B
2 C E F E
3 D F G G
df_charac_by_cat
cat charac
0 a 10
1 b 20
2 c 25
3 d 15
我希望生成以下数据帧:
df
item cat_nb sum_charac
0 A 3 45
1 B 4 70
2 C 1 10
3 D 1 10
4 E 2 45
5 F 2 45
6 G 2 40
其中:
- cat_nb是列的nb,其中每个项目出现在_cat中的df_项目_上
- sum_charac是不同类别的_cat从df_charac_得到的charac之和
s_items
0 A
1 B
2 C
3 D
4 E
5 F
6 G
更具体地说,我有属于某个类别的产品,我有与某个类别关联的商店。
我想知道,根据每种产品的种类和每家商店的类别,每种产品在多少家商店都有售。希望一切都清楚
- (a、b、c、d)为类别
- (A、B、C、D、E、F、G)为产品
- (10,20,25,15)是每个类别关联的店铺数量
df_item_in_cat.melt().merge(df_charac_by_cat, left_on='variable', right_on='cat')\
.groupby('value')['charac'].agg(['count','sum'])
输出:
value count sum
0 A 3 45
1 B 4 70
2 C 1 10
3 D 1 10
4 E 3 60
5 F 2 45
6 G 2 40
item cat_nb sum_charac
0 A 3 45
1 B 4 70
2 C 1 10
3 D 1 10
4 E 3 60
5 F 2 45
6 G 2 40
这是所有列的重命名和“内务管理”:
输出:
value count sum
0 A 3 45
1 B 4 70
2 C 1 10
3 D 1 10
4 E 3 60
5 F 2 45
6 G 2 40
item cat_nb sum_charac
0 A 3 45
1 B 4 70
2 C 1 10
3 D 1 10
4 E 3 60
5 F 2 45
6 G 2 40
斯科特伯顿的答案要好得多,但我还是有点喜欢我所做的 我在想什么
df\u项中的值
我知道我迟到了,但我也有点喜欢我的解决方案;) 使用
np.unique
v, _, c = np.unique(df.values, 1, return_counts=True)
产生
>>> print(v,c)
['A' 'B' 'C' 'D' 'E' 'F' 'G'], [3 4 1 1 3 2 2]
然后
第二列比较复杂,但使用defaultdict
x = defaultdict(set)
from collections import defaultdict
for d in df.to_dict('r'):
for k,v in d.items():
x[v].add(k)
以致
>>> x
{'A': {'a', 'b', 'd'},
'B': {'a', 'b', 'c', 'd'},
'E': {'b', 'c', 'd'},
'C': {'a'},
'F': {'b', 'c'},
'D': {'a'},
'G': {'c', 'd'}}
然后我们可以使用DICT的O(1)查找来映射它
d2 = df2.set_index('cat').to_dict()['charac']
s = pd.Series({k: sum(d2[v_] for v_ in v) for k,v in (x).items()})
dff.loc[:, 'f'] = s
我们有输出
cat_nb f
A 3 45
B 4 70
C 1 10
D 1 10
E 3 60
F 2 45
G 2 40
哦,天哪。。。你应该看看我造成的混乱(-:谢谢=)!这正是我想要的!不知道熔化功能,很酷@马修韦隆,欢迎你,谢谢你。快乐编码<代码>平铺而不是
重复
向导永远不会迟到。他正好在他想去的时候到达。
cat_nb f
A 3 45
B 4 70
C 1 10
D 1 10
E 3 60
F 2 45
G 2 40