python pandas 标记列中每个值是否有多个唯一行
python pandas flag if more than one unique row per value in column
在下面的 DataFrame 中,我有三列:
Code | Category | Count
X A 89734
X A 239487
Y B 298787
Z B 87980
W C 098454
我需要添加一列,如果一个类别有多个唯一代码(如上例中的 B),它会得到一个标志,表示它是一个测试。
所以我正在寻找的输出是这样的:
Code | Category | Count | Test_Flag
X A 89734
X A 239487
Y B 298787 T
Z B 87980 T
W C 098454
您可以使用 filtration with nunique
for finding index values
and then create new columns with loc
:
print (df.groupby('Category').Code.filter(lambda x: x.nunique() > 1))
2 Y
3 Z
Name: Code, dtype: object
idx = df.groupby('Category').Code.filter(lambda x: x.nunique() > 1).index
print (idx)
Int64Index([2, 3], dtype='int64')
df.loc[idx, 'Test_Flag'] = 'T'
#if necessary, replace NaN to empty string
#df.Test_Flag = df.Test_Flag.fillna('')
print (df)
Code Category Count Test_Flag
0 X A 89734 NaN
1 X A 239487 NaN
2 Y B 298787 T
3 Z B 87980 T
4 W C 98454 NaN
loc
中使用的布尔掩码 transform
的另一种解决方案:
print (df.groupby('Category').Code.transform('nunique'))
0 1
1 1
2 2
3 2
4 1
Name: Code, dtype: int64
mask = df.groupby('Category').Code.transform('nunique') > 1
print (mask)
0 False
1 False
2 True
3 True
4 False
Name: Code, dtype: bool
df.loc[mask, 'Test_Flag'] = 'T'
#if necessary, replace NaN to empty string
#df.Test_Flag = df.Test_Flag.fillna('')
print (df)
Code Category Count Test_Flag
0 X A 89734 NaN
1 X A 239487 NaN
2 Y B 298787 T
3 Z B 87980 T
4 W C 98454 NaN
您也可以选择 transform
with numpy.where
来填充值。
df['Test_flag'] = np.where(df.groupby('Category').Code.transform('nunique') > 1, 'T', '')
>>> df
Category Code Count Test_flag
0 A X 89734
1 A X 239487
2 B Y 298787 T
3 B Z 87980 T
4 C W 98454
在下面的 DataFrame 中,我有三列:
Code | Category | Count
X A 89734
X A 239487
Y B 298787
Z B 87980
W C 098454
我需要添加一列,如果一个类别有多个唯一代码(如上例中的 B),它会得到一个标志,表示它是一个测试。
所以我正在寻找的输出是这样的:
Code | Category | Count | Test_Flag
X A 89734
X A 239487
Y B 298787 T
Z B 87980 T
W C 098454
您可以使用 filtration with nunique
for finding index values
and then create new columns with loc
:
print (df.groupby('Category').Code.filter(lambda x: x.nunique() > 1))
2 Y
3 Z
Name: Code, dtype: object
idx = df.groupby('Category').Code.filter(lambda x: x.nunique() > 1).index
print (idx)
Int64Index([2, 3], dtype='int64')
df.loc[idx, 'Test_Flag'] = 'T'
#if necessary, replace NaN to empty string
#df.Test_Flag = df.Test_Flag.fillna('')
print (df)
Code Category Count Test_Flag
0 X A 89734 NaN
1 X A 239487 NaN
2 Y B 298787 T
3 Z B 87980 T
4 W C 98454 NaN
loc
中使用的布尔掩码 transform
的另一种解决方案:
print (df.groupby('Category').Code.transform('nunique'))
0 1
1 1
2 2
3 2
4 1
Name: Code, dtype: int64
mask = df.groupby('Category').Code.transform('nunique') > 1
print (mask)
0 False
1 False
2 True
3 True
4 False
Name: Code, dtype: bool
df.loc[mask, 'Test_Flag'] = 'T'
#if necessary, replace NaN to empty string
#df.Test_Flag = df.Test_Flag.fillna('')
print (df)
Code Category Count Test_Flag
0 X A 89734 NaN
1 X A 239487 NaN
2 Y B 298787 T
3 Z B 87980 T
4 W C 98454 NaN
您也可以选择 transform
with numpy.where
来填充值。
df['Test_flag'] = np.where(df.groupby('Category').Code.transform('nunique') > 1, 'T', '')
>>> df
Category Code Count Test_flag
0 A X 89734
1 A X 239487
2 B Y 298787 T
3 B Z 87980 T
4 C W 98454