Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 如何在大熊猫身上做一个带计数的vlookup_Pandas_Merge_Count_Pivot_Vlookup - Fatal编程技术网

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)是每个类别关联的店铺数量
ex:产品A分为3类(A、b、d),可在45家商店购买,因为10+20+15=45

这就像excel中的“vlookup”

我很确定我可以用iterrows来完成,但我正在寻找一个“漂亮”的解决方案

我想给你们看一些研究,但我真的不知道怎么做。。 我试过使用merges或pivot,但实际上没有用。

您需要:

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

斯科特伯顿的答案要好得多,但我还是有点喜欢我所做的

我在想什么
  • 将两个输入数据帧转换为系列,以便我可以在新索引上操作
  • 该索引应基于\u cat中的
    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