我不知道要解决这个问题。我有一个看起来像这样的数据框
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排序。
感谢您的任何建议。
答案 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)