问题描述
我有一个多级数据框,我想将列secret
中的值与列group
中的条件进行比较。如果group = A,我们允许另一个数据框中的值为空或na。否则,对于不匹配的输出为INVALID。
多级数据框:
name secret group
df1 df2 df1 df2 df1 df2
id
1 Tim Tim random na A A
2 Tom Tom tree A A
3 Alex Alex apple apple B B
4 May May file cheese C C
预期的秘密输出
id name secret group
1 Tim na A
2 Tom A
3 Alex apple B
4 May INVALID C
到目前为止,我有:
result_df['result'] = multilevel_df.groupby(level=0,axis=0).apply(lambda x: secret_check(x))
#take care of the rest by compare column by column
result_df = multilevel_df.groupby(level=0,axis=1).apply(lambda x: validate(x))
def validate(x):
if x[0] == x[1]:
return x[1]
else:
return 'INVALID'
def secret_check(x):
if (x['group'] == 'A' and pd.isnull(['secret']): #this line is off
return x[1]
elif x[0] == x[1]:
return x[1]
else:
return 'INVALID'
解决方法
如果我理解的正确,那么如果df2
和df1
中的秘密不同并且该组不是A,您想将df2
中的“秘密”标记为无效。 :
condition = (df[('secret','df1')] != df[('secret','df2')]) &\
df[('group','df1')] != 'A')
df.loc[condition,('secret','df2')] = 'INVALID'
,
假设我们具有以下数据框:
df = pd.DataFrame({0: {0: 1,1: 2,2: 3,3: 4},1: {0: 'Tim',1: 'Tom',2: 'Alex',3: 'May'},2: {0: 'Tim',3: {0: 'random',1: 'tree',2: 'apple',3: 'file'},4: {0: 'na',1: '',3: 'cheese'},5: {0: 'A',1: 'A',2: 'B',3: 'C'},6: {0: 'A',3: 'C'}})
df
df.columns = pd.MultiIndex.from_tuples([('id',''),('name','df1'),'df2'),('group','df2')])
df
In[1]:
id name secret group
df1 df2 df1 df2 df1 df2
0 1 Tim Tim random na A A
1 2 Tom Tom tree A A
2 3 Alex Alex apple apple B B
3 4 May May file cheese C C
- 您可以使用
np.select()
根据条件返回结果。 -
.droplevel()
脱离多索引数据框 - 和
df.loc[:,~df.columns.duplicated()]
删除重复的列。由于我们将答案设置为df1
列,因此不需要df2
列。
df[('secret','df1')] = np.select([(df[('group','df2')] != 'A') &
(df[('secret','df2')])],#condition 1
[df[('secret','df1')] + ' > ' + df[('secret','df2')]],#result 1
df[('secret','df2')]) #alterantive if conditions not met
df.columns = df.columns.droplevel(1)
df = df.loc[:,~df.columns.duplicated()]
df
Out[1]:
id name secret group
0 1 Tim na A
1 2 Tom A
2 3 Alex apple B
3 4 May file > cheese C