bugfix> python > 投稿

以下の例vとdfのような辞書とデータフレームがあります。 dfのアイテムを検索し、dictの値と共通のフィールド値の最大数を持つアイテムを返します。この場合、項目3になります。多分適用をラムダ関数と共に使用するか、dfを転置することを考えていました。静かに頭を動かせない。誰かがこれを行うための巧妙な方法やヒントを持っているなら、彼らは大歓迎です。

入力:

v={'size':1,'color':red}
df:
item size color
2    2    red
3    1    red
Output:
3

回答 2 件
  • 1行 DataFrame を作成します  および merge  オリジナルで:

    a = pd.DataFrame(v, index=[0]).merge(df)['item']
    print (a)
    0    3
    Name: item, dtype: int64
    
    

    query を使用した別のソリューション 、ただし、ストリング値が dict の場合  別の " を追加する必要があります :

    v1 = {k: '"{}"'.format(v) if isinstance(v, str) else v for k, v in v.items()}
    print (v1)
    {'size': 1, 'color': '"red"'}
    df = df.query(' & '.join(['{}=={}'.format(i,j) for i, j in v1.items()]))['item']
    print (df)
    1    3
    Name: item, dtype: int64
    
    

    出力では3つの方法が可能です- Series  複数の値、1つの値、または空で、ヘルパー関数が作成されました:

    def get_val(v):
        x = pd.DataFrame(v, index=[0]).merge(df)['item']
        if x.empty:
            return 'Not found'
        elif len(x) == 1:
            return x.values[0]
        else:
            return x.values.tolist()
    
    
    print (get_val({'size':1,'color':'red'}))
    3
    print (get_val({'size':10,'color':'red'}))
    Not found
    print (get_val({'color':'red'}))
    [2, 3]
    
    

  • 別の解決策は、データフレームの代わりに辞書を使用することです。

    v = {'size': 1, 'color': 'red'}
    match_count = {}
    fields = df.columns[1:]
    for k, value in df.to_dict(orient='index').items():
        match_count[value['item']] = sum(value[i] == v[i] for i in fields & v.keys())
    
    

    結果

    print(match_count)
    # {2: 1, 3: 2}
    res = max(match_count.items(), key=lambda x: x[1])
    print(res)
    # (3, 2)
    
    

あなたの答え