我希望用列表中的值替换pandas-df中的唯一值。我希望使用唯一值的排序,而不是使用replace()
的硬编码值。使用下面的df
,我想使用lst
,并在Val3
中使用唯一值。因此,对于第一个唯一值使用lst[0]
,第二个使用lst[1]
。
import pandas as pd
df = pd.DataFrame({'Val1': [1, 4, 7, 10, 12, 12],
'Val2': ['12', '14', '14', '13', '15', '15'],
'Val3': ['X', 'Y', 'X', 'Y', 'Y', 'X']})
lst = ['A','B']
注:
我不能使用:
df['Val3'] = df['Val3'].replace('X','A')
df['Val3'] = df['Val3'].replace('Y','B')
因为Val3
中的值会有所不同,所以我希望它是动态的。
replace获取一个列表,这样您就可以获取该系列的unique
并用列表进行替换(确保列表的长度与系列中唯一值的长度匹配(:
df['Val3'] = df['Val3'].replace(df['Val3'].unique(),lst)
#or df['Val3'].replace(dict(zip(df['Val3'].unique(),lst)))
0 A
1 B
2 A
3 B
4 B
5 A
Name: Val3, dtype: object
如果可能的话,一般的解决方案是创建字典来替换不同数量的值-这里最后一个值Z
没有被替换:
df = pd.DataFrame({'Val1': [1, 4, 7, 10, 12, 12],
'Val2': ['12', '14', '14', '13', '15', '15'],
'Val3': ['X', 'Y', 'X', 'Y', 'Y', 'Z']})
lst = ['A','B']
df['Val3'] = df['Val3'].replace(dict(zip(df['Val3'].unique(),lst)))
print (df)
Val1 Val2 Val3
0 1 12 A
1 4 14 B
2 7 14 A
3 10 13 B
4 12 15 B
5 12 15 Z
如果要用第一个值替换列表中的所有值,并将所有其他值替换为相同的默认值,请使用Series.map
和Series.fillna
:
df = pd.DataFrame({'Val1': [1, 4, 7, 10, 12, 12],
'Val2': ['12', '14', '14', '13', '15', '15'],
'Val3': ['X', 'Y', 'X', 'Y', 'W', 'Z']})
lst = ['A','B']
df['Val3'] = df['Val3'].map(dict(zip(df['Val3'].unique(),lst))).fillna('Other')
print (df)
Val1 Val2 Val3
0 1 12 A
1 4 14 B
2 7 14 A
3 10 13 B
4 12 15 Other
5 12 15 Other
如果总是通过列表的值的数量来匹配唯一值的数量,那么性能对于numpy索引很重要——使用factorize
:将lst
转换为aray
lst = ['A','B']
df['Val3'] = np.array(lst)[pd.factorize(df['Val3'].to_numpy())[0]]
print (df)
Val1 Val2 Val3
0 1 12 A
1 4 14 B
2 7 14 A
3 10 13 B
4 12 15 B
5 12 15 B