パンダGROUPBYで条件に基づいて列に変更を適用します

ワープ:

私は他の場所で解決された同様の問題を見落としている場合は謝罪。これらは、私はこの質問をする前に見ていることの記事、次のとおりです。

条件に基づいてパンダデータフレームGROUPBY

パンダは、条件に基づいて置き換えるGROUPBY

Pythonは条件に基づいてデータフレームでグループをパンダ

問題:

データフレームを考えます

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1,2,2,3,3,4,5,5,6,6],
    'b': np.random.rand(10),
    'c': 10*[0],
})

それは列持つaアイデンティティを保持し、列bのランダムな値を持って、私は列の値を置き換えラベルにしたいですc

1つのだけのエントリがある場合はa、変更は適用されるべきではありません。

2つのエントリがある場合a、私は内の項目ラベルを変更したいcれるb最小限のですが。

    a   b           c
0   1   0.472015    0  # <-- only one entry for a => nothing changes
1   2   0.553018    2  # <-- b is minimal => c gets value 2
2   2   0.770302    0
3   3   0.992023    0
4   3   0.119448    2  # <-- b is minimal => c gets value 2

アプローチ:

組み合わせgroupbyaggおよび.loc

g = df.groupby('a').agg({'b': [np.argmin, np.argmax]})
df.loc[g[g[('b', 'argmin')] != g[('b', 'argmax')]][('b', 'argmin')], 'c' ] = 2

これは動作しますが、かなり遠回りようです。

質問

これについて移動するあまり不器用な方法は何ですか?

感謝

ヘルプは大歓迎です!

編集:

グループは、1つまたは2人のメンバーを持っています。両方のメンバーが同じお持ちの場合b値を、何も起こらないはずです。

df = pd.DataFrame({
    'a': [1,2,2,3,3,4,5,5,6,6],
    'b': [1,1,2,1,2,1,1,1,2,1],
    'c': 10*[0],
})

df.loc[df['b'].eq(df.groupby('a')['b'].transform('min')),'c']=2

out:

    a   b   c
0   1   1   2
1   2   1   2
2   2   2   0
3   3   1   2
4   3   2   0
5   4   1   2
6   5   1   2
7   5   1   2
8   6   2   0
9   6   1   2

df.loc[df.index==df.groupby('a')['b'].transform('idxmin'),'c']=2

    a   b   c
0   1   1   2  # <-- a has only one member, so this shouldn't be changed
1   2   1   2
2   2   2   0
3   3   1   2
4   3   2   0
5   4   1   2
6   5   1   2
7   5   1   0
8   6   2   0
9   6   1   2
anky_91:

あなたは使用することができますgroupby+transformdf.loc[]

df.loc[df['b'].eq(df.groupby('a')['b'].transform('min')),'c']=2

例:

df.loc[df['b'].eq(df.groupby('a')['b'].transform('min')),'c']=2
print(df)
   a         b  c
0  1  0.126956  2
1  2  0.249078  2
2  2  0.929619  0
3  3  0.013735  2
4  3  0.192781  0
5  4  0.268828  2
6  5  0.649238  2
7  5  0.767545  0
8  6  0.678478  2
9  6  0.815916  0

EDIT:

g = df.groupby('a')
cond = pd.Series(df.index==g['b'].transform('idxmin')) & g['a'].transform('count').gt(1)
df.loc[cond,'c'] = 2

print(df)

   a  b  c
0  1  1  0
1  2  1  2
2  2  2  0
3  3  1  2
4  3  2  0
5  4  1  0
6  5  1  2
7  5  1  0
8  6  2  0
9  6  1  2

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=275066&siteId=1