与熊猫的迭代比较

时间:2017-12-18 16:10:58

标签: python pandas dataframe

我不知道要解决这个问题。我有一个看起来像这样的数据框

cuenta_bancaria nombre_empresa  perfil_cobranza  usuario_id  usuario_web 
5545              a              123              500199         5012
5551              a              123              500199         3321
5551              a               55              500199         5541
5551              b               55              500199         5246

我需要做的是在每个usuario_id的每一行之间进行迭代,并检查每一行之间是否存在差异,并创建一个更改行的新数据集和负责此更改的usuario_web,以生成数据框看起来像这样:

usuario_id     cambio           usuario_web
 500199       cuenta_bancaria    3321
 500199       perfil_cobranza    5541
 500199       nombre_empresa     5246

有没有办法做到这一点?我在python上使用pandas,这个数据集可能有点大,让我们说大约10000行,按usuario_id排序。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

将相邻行与ne + shift进行比较,获取掩码,并将其用于

  • 索引到df以获取所需的行
  • 索引到df.columns以获取所需的列更改
c = df.columns.intersection(
        ['nombre_empresa', 'perfil_cobranza', 'cuenta_bancaria']
)

i = df[c].ne(df[c].shift())
j = i.sum(1).eq(1)
df = df.loc[j, ['usuario_id', 'usuario_web']]
df.insert(1, 'cambio', c[i[j].values.argmax(1)])

df

   usuario_id           cambio  usuario_web
1      500199  cuenta_bancaria         3321
2      500199  perfil_cobranza         5541
3      500199   nombre_empresa         5246

答案 1 :(得分:1)

有几种方法可以通过数据框进行迭代:

for index, row in df.iterrows():
    #blah blah blah

但由于您想要引用前一行,我认为最简单的方法是按位置迭代:

df2 = pd.DataFrame()
for i in range(1, np.shape(df)[0]):
    current = df.iloc[i]
    last = df.iloc[i-1]
    newrow = {'usario_id' = current['usario_id'], 'usario_web'= current['usario_web']}
    if current['cuenta_bancaria'] != last['cuenta_bancaria']:
        newrow['cambio'] = 'cuenta_bancaria'
        df2 = df2.append(newrow, ignore_index = False)
    elif current['nombre_empresa'] != last['nombre_empresa']:
        newrow['cambio'] = 'nombre_empresa'
        df2 = df2.append(newrow, ignore_index = False)
    elif current['perfil_cobranza'] != last['perfil_cobranza']:
        newrow['cambio'] = 'perfil_cobranza'
        df2 = df2.append(newrow, ignore_index = False)