我有一个名为‘data’的数据帧:
USER VALUE VALUE2
0 XOXO 21 AAA
1 ABC-1 2 BBB
2 ABC-1B 4 CCC
3 ABC-2 4 DDD
4 ABC-2B 6 EEE
5 PEPE 12 FFF我通过一些代码来组合相似的名称:
data = pd.DataFrame({'USER':['XOXO','ABC-1','ABC-1B','ABC-2','ABC-2B', 'PEPE'], 'VALUE':[21,2,4,4,6,12], 'VALUE2':['AAA','BBB','CCC','DDD','EEE', 'FFF']})
data.USER = data.USER.str.replace('(-\d)B', r"\1")
data = data.groupby('USER', as_index=False, sort=False).VALUE.mean()然而,我最终得到了一个数据帧,就像这样,删除了VALUE2:
USER VALUE
0 XOXO 21
1 ABC-1 3
2 ABC-2 5
3 PEPE 12如何通过保留原始用户的VALUE2来修改代码以保留VALUE2?因此,用户'ABC-1‘的VALUE2将保留为'BBB’,'ABC-2‘将保留为'DDD’
USER VALUE VALUE2
0 XOXO 21 AAA
1 ABC-1 3 BBB
2 ABC-2 5 DDD
3 PEPE 12 FFF发布于 2020-08-28 06:16:18
去掉尾部B后按USER分组。然后使用.str.contains()和.isin()实现适当的布尔值选择并过滤最终数据帧。
df['VALUE']=df[['USER', 'VALUE', 'VALUE2']].groupby(df.USER.str.split('(?<=[1-2])(B)').str[0])['VALUE'].transform('mean')
df[~((df.USER.str.contains('ABC'))&(~df.VALUE2.isin(['BBB','DDD'])))]
USER VALUE VALUE2
0 XOXO 21 AAA
1 ABC-1 3 BBB
3 ABC-2 5 DDD
5 PEPE 12 FFF如何工作
#Strip trailing B in USER
df.USER=df.USER.str.split('(?<=[1-2])(B)').str[0]
USER VALUE VALUE2
0 XOXO 21 AAA
1 ABC-1 2 BBB
2 ABC-1 4 CCC
3 ABC-2 4 DDD
4 ABC-2 6 EEE
5 PEPE 12 FFF# groupby变换求平均值
df['VALUE']=df.groupby(df.USER.str.split('(?<=[1-2])(B)').str[0])['VALUE'].transform('mean')
print(df)
USER VALUE VALUE2
0 XOXO 21 AAA
1 ABC-1 3 BBB
2 ABC-1 3 CCC
3 ABC-2 5 DDD
4 ABC-2 5 EEE
5 PEPE 12 FFF#Boolean选择任何包含ABC;(df.USER.str.contains('ABC'))但没有BBB和DDD;(~df.VALUE2.isin(['BBB','DDD']))的内容
#合并两个选择,然后使用~反转选择
~((df.USER.str.contains('ABC'))&(~df.VALUE2.isin(['BBB','DDD'])))#Finally过滤数据帧
https://stackoverflow.com/questions/63624546
复制相似问题