有没有更好的方法可以遍历Pandas Dataframe?

时间:2020-08-17 19:35:33

标签: pandas dataframe loops

我正在检查订阅产品数据库。 并且需要遍历一列并将其与同一行中的所有列进行比较。 最后,如果在指定的列上找到相同的值,则将其分配为true或false。

df_full_part1

df_full_part2

df_full_part3

df_full_part4

我正在尝试的循环

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等

1 个答案:

答案 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'