ワープ:
私は他の場所で解決された同様の問題を見落としている場合は謝罪。これらは、私はこの質問をする前に見ていることの記事、次のとおりです。
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
アプローチ:
組み合わせgroupby
、agg
および.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+transform
とdf.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