我正在检查订阅产品数据库。 并且需要遍历一列并将其与同一行中的所有列进行比较。 最后,如果在指定的列上找到相同的值,则将其分配为true或false。
我正在尝试的循环
for index, row in df_full.iterrows():
for col in all_types_df.columns:
for col2 in df_full.columns[8:]:
if 'nao' in col2:
if df_full.loc[index]['got_unexpected'] == True or df_full.loc[index][col2] == 'nenhum':
continue
else:
df_full.at[index, 'got_unexpected'] = (all_types_df.loc[index][col] == df_full.loc[index][col2])
elif 'sempre' in col2:
if df_full.loc[index]['got_expected'] == True or df_full.loc[index][col2] == 'nenhum':
continue
else:
df_full.at[index, 'got_expected'] = (all_types_df.loc[index][col] == df_full.loc[index][col2])
{'all_types_0': ['protetor',
'spray',
'pinceis',
'pinceis',
'hidratante',
'hidratante'],
'all_types_1': [' esfoliante',
' protetor',
' po',
' geral',
' serum',
' shampoo'],
'all_types_2': [' spray',
' toalha',
' geral',
' geral',
' tonico',
' tonico'],
'all_types_3': [' toalha',
' esfoliante',
'nenhum',
' po',
' shampoo',
' serum'],
'box_order_id': [60501, 68771, 70333, 79623, 80858, 89258],
'email': ['isabelasantana@globo.com',
'stefany_mend@hotmail.com',
'isabelasantana@globo.com',
'stefany_mend@hotmail.com',
'isabelasantana@globo.com',
'stefany_mend@hotmail.com'],
'got_expected': [True, True, True, False, True, True],
'got_unexpected': [False, 'False', False, 'False', False, 'False'],
'make_nao_quero_receber_0': ['lapis-boca',
'lapis-boca',
'lapis-boca',
'lapis-boca',
'lapis-boca',
'lapis-boca'],
'make_sempre_0': ['batom', 'corretivo', 'batom', 'pinceis', 'batom', 'batom'],
'make_sempre_1': ['iluminador',
'batom',
'iluminador',
'produtos-sombrancelha',
'iluminador',
'blush'],
'make_sempre_2': ['pinceis',
'produtos-sombrancelha',
'pinceis',
'batom',
'pinceis',
'corretivo'],
'make_sempre_3': ['primer',
'pinceis',
'primer',
'blush',
'primer',
'delineador'],
'make_sempre_4': ['nenhum',
'mascara-cilios',
'nenhum',
'corretivo',
'nenhum',
'gloss'],
'make_sempre_5': ['nenhum',
'iluminador',
'nenhum',
'delineador',
'nenhum',
'iluminador'],
'make_sempre_6': ['nenhum',
'gloss',
'nenhum',
'gloss',
'nenhum',
'mascara-cilios'],
'make_sempre_7': ['nenhum',
'blush',
'nenhum',
'iluminador',
'nenhum',
'pinceis'],
'make_sempre_8': ['nenhum',
'delineador',
'nenhum',
'mascara-cilios',
'nenhum',
'produtos-sombrancelha'],
'skin_nao_quero_receber_0': ['balm-tatuagem',
'nenhum',
'balm-tatuagem',
'nenhum',
'balm-tatuagem',
'nenhum'],
'skin_sempre_0': ['esfoliante',
'limpador-facial',
'esfoliante',
'esfoliante',
'esfoliante',
'esfoliante'],
'skin_sempre_1': ['hidratante-labial',
'esfoliante',
'hidratante-labial',
'hidratante-labial',
'hidratante-labial',
'hidratante-labial'],
'skin_sempre_2': ['hidratante',
'hidratante-labial',
'hidratante',
'hidratante',
'hidratante',
'hidratante'],
'skin_sempre_3': ['limpador-facial',
'hidratante',
'limpador-facial',
'limpador-facial',
'limpador-facial',
'limpador-facial'],
'skin_sempre_4': ['serum', 'serum', 'serum', 'serum', 'serum', 'serum'],
'skin_sempre_5': ['tonico', 'nenhum', 'tonico', 'nenhum', 'tonico', 'nenhum'],
'skin_sempre_6': ['creme-de-maos',
'nenhum',
'creme-de-maos',
'nenhum',
'creme-de-maos',
'nenhum']}
我之所以创建此循环,是因为我不知道会得到多少列,并且每个列都有自己的名称。例如。 Column_1,Column_2,Column_3等
答案 0 :(得分:0)
这是仅使用内置于熊猫中的矢量化函数的解决方案。
首先,请保持友善,并始终提供可以使用df.head(10).to_dict('list')
,df.head(10)
或可调用的行(如如下所示)轻松地复制到IDE中的示例数据。
df_full = pd.DataFrame([
['food', 'drink', 'toy', 'toy', 'food'],
['food', 'socks', 'ball', 'toy', 'food'],
['bowl', 'supply', 'toy', 'food', 'toy'],
['food', 'drink', 'socks', 'socks', 'bowl']],
columns=['received', 'received1', 'received2', 'dont_want', 'want'])
当然要确保您的样本具有代表性,并且可以重现您要询问的任何行为/错误。
现在,与您的问题无关,但请记住,您可以使用df.filter
选择具有特定模式的列。
all_types_df = df_full.filter(regex=r'received')
最后一个实际问题。
df_full['exp'] = ( # find out if they got something they wanted, and save in a new column
(all_types_df ==
df_full.want # get want column as 1D array
.to_frame().values) # cast as a 2D array, so pandas can broadcast and compare to the 2D df
.any(axis=1) # the lines above return a boolean df with same shape as df_full, aggregate with any row-wise
) # returns a boolean series
df_full['une'] = ( # find out if they got something they did not want
(all_types_df == df_full.dont_want.to_frame().values).any(axis=1)
) # returns a boolean series
# to account for 'anything' in either column want/dont_want
# once a column is created you can access it as an attribute
df_full.exp = df_full.exp | (df_full.want=='anything')
df_full.une = df_full.une | (df_full.dont_want=='anything')
print(df_full)
输出
received received1 received2 dont_want want exp une
0 food drink toy toy food True True
1 food socks ball toy food True False
2 bowl supply toy food toy True False
3 food drink socks socks bowl False True
请注意,当第一行的行中有False
时,表在(1, exp)
上有'food'
。