numpy Pandas:基于所有重复项中的值更改包含特定列的重复值的行的子集

abithluo  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(93)

我是Pandas的新手,试图了解如何修改特定列具有重复值的行的子集,并根据对这些重复项的条件检查来决定要更改哪些行。
说:“我有一个这样的数据框:

Class      Length     Head Teacher   Premium Course                       
0   Maths      Medium     Mr. Bloggs     Yes
1   English    Short      Mr. Plum       Yes
2   English    Long       Mrs. Green     Yes
3   English    Medium     Mr. Top        Yes 
4   Science    Long       Mrs. Blue      Yes    
5   Science    Long       Mr. Red        Yes
6   ...

字符串
只要有重复的班级,我就想用最长班级的班主任替换所有重复班级的教师,并删除所有不是最长班级的重复班级的高级课程值。如果重复的课程都是相同的长度,那么只需从第一个重复的老师,而高级课程则相反。

Class      Length     Head Teacher   Premium Course                       
0   Maths      Medium     Mr. Bloggs     Yes
1   English    Short      Mrs. Green     
2   English    Long       Mrs. Green     Yes
3   English    Medium     Mrs. Green      
4   Science    Long       Mrs. Blue      Yes    
5   Science    Long       Mrs. Blue
6   ...


在Python中,我通常会使用循环,条件语句等,并在内存中构建一个新的列表。但我在试图找出Pandas的最佳方法。
我一直在研究 duplicatedgroupby 函数,但一直无法找到解决方案。任何建议或帮助都是有帮助的。试着转变成一种“矢量化”的思维方式。

kuhbmx9i

kuhbmx9i1#

示例代码

import pandas as pd
data1 = {'Class': ['Maths', 'English', 'English', 'English', 'Science', 'Science'], 
         'Length': ['Medium', 'Short', 'Long', 'Medium', 'Long', 'Long'], 
         'Head Teacher': ['Mr. Bloggs', 'Mr. Plum', 'Mrs. Green', 'Mr. Top', 'Mrs. Blue', 'Mr. Red'], 
         'Premium Course': ['Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes']}
df = pd.DataFrame(data1)

字符串

第一步

接通条件

m = {'Short':0, 'Medium':1, 'Long':2}
cond = df.groupby('Class')['Length'].transform(lambda x: x.index == x.map(m).idxmax())


第二

0     True
1    False
2     True
3    False
4     True
5    False
Name: Length, dtype: bool

第二步

编辑列

df['Head Teacher'] = df['Head Teacher'].where(cond).groupby(df['Class']).ffill().bfill()
df['Premium Course'] = df['Premium Course'].where(cond)


df

Class   Length  Head Teacher    Premium Course
0   Maths   Medium  Mr. Bloggs      Yes
1   English Short   Mrs. Green      NaN
2   English Long    Mrs. Green      Yes
3   English Medium  Mrs. Green      NaN
4   Science Long    Mrs. Blue       Yes
5   Science Long    Mrs. Blue       NaN

42fyovps

42fyovps2#

使用有序CategoricalLength列,因此可以通过DataFrame.sort_valuesDataFrame.duplicated创建掩码,DataFrame.sort_index用于原始行顺序,并将NaN s设置为Series.mask中不匹配的值,其中GroupBy.transform用于获取第一个非NaN值:

df['Length'] = pd.Categorical(df['Length'], 
                              categories=['Long','Medium','Short'],
                              ordered=True)

mask = df.sort_values('Length').duplicated(['Class']).sort_index()
df['Head Teacher'] = df['Head Teacher'].mask(mask).groupby(df['Class']).transform('first')
df['Premium Course'] = df['Premium Course'].mask(mask)

print (df)
     Class  Length Head Teacher Premium Course
0    Maths  Medium   Mr. Bloggs            Yes
1  English   Short   Mrs. Green            NaN
2  English    Long   Mrs. Green            Yes
3  English  Medium   Mrs. Green            NaN
4  Science    Long    Mrs. Blue            Yes
5  Science    Long    Mrs. Blue            NaN

字符串

相关问题