使用pandas

时间:2017-05-13 22:37:27

标签: python validation pandas

我试图为我的问题找到一个解决方案,但是做得很短。如果它存在于其他地方,请告诉我。

我有一个包含4列的数据框,如下所示:

'A'    'B'    'C'      'D'   

cheese  5     grapes    7  
grapes  7     cheese    8  
steak   1     eggs      21  
eggs    2     steak     1

“C”和“D”中的条目必须与“A”和“B”中的值匹配,但不能与行匹配;例如,如果“奶酪”在“B”中具有“5”,则“奶酪”在“D”中不能具有“8”。在不匹配的情况下,必须将“C”和“D”值更正为默认值。在这种情况下,应该更正“奶酪”,使C:默认和D:0。与鸡蛋和葡萄相同。牛排很好。

所以输出应该如下所示:

'A'    'B'  'C'     'D'
cheese  5    grapes  7 
grapes  7    default 0  
steak   1    default 0   
eggs    2    steak   1

我尝试将“A”和“B”转换为具有唯一值的列表,然后尝试根据列表替换“C”和“D”值。我尝试了所有可以在stackoverflow上找到的条件df.replace()技巧,但没有提出任何建议。

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

<强>设置

df = pd.DataFrame({'A': {0: 'cheese', 1: 'grapes', 2: 'steak', 3: 'eggs'},
 'B': {0: 5, 1: 7, 2: 1, 3: 2},
 'C': {0: 'grapes', 1: 'default', 2: 'default', 3: 'steak'},
 'D': {0: 7, 1: 0, 2: 0, 3: 1}})

df
Out[1262]: 
        A  B        C  D
0  cheese  5   grapes  7
1  grapes  7  default  0
2   steak  1  default  0
3    eggs  2    steak  1

<强>解决方案

#find rows where df.C should be set to default.
df.C = df.apply(lambda x: x.C if ((x.C not in df.A.tolist()) or (x.D==df.loc[df.A==x.C, 'B'].iloc[0])) else 'default', axis=1)
#set df.D to 0 for df.C == default
df.loc[df.C=='default','D']=0

df
Out[1259]: 
        A  B        C  D
0  cheese  5   grapes  7
1  grapes  7  default  0
2   steak  1  default  0
3    eggs  2    steak  1