我试图为我的问题找到一个解决方案,但是做得很短。如果它存在于其他地方,请告诉我。
我有一个包含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()技巧,但没有提出任何建议。
提前感谢您提供的任何帮助。
答案 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