Python 3.x 基于多列的行间数据帧差异

Python 3.x 基于多列的行间数据帧差异,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我试图根据多列计算行之间的差异。数据集非常大,我在下面粘贴虚拟数据来描述问题: 如果我想计算宠物+名字级别的每日体重差异。到目前为止,我只提出了连接这些列并基于新列和日期列创建多索引的解决方案。但我认为应该有更好的办法。在真实的数据集中,我使用了3列以上的列来计算行差异 df['pet_name']=df.pet + df.name df.set_index(['pet_name','date'],inplace = True) df.sort_index(inplace=True) df

我试图根据多列计算行之间的差异。数据集非常大,我在下面粘贴虚拟数据来描述问题:

如果我想计算宠物+名字级别的每日体重差异。到目前为止,我只提出了连接这些列并基于新列和日期列创建多索引的解决方案。但我认为应该有更好的办法。在真实的数据集中,我使用了3列以上的列来计算行差异

df['pet_name']=df.pet + df.name

df.set_index(['pet_name','date'],inplace = True)
df.sort_index(inplace=True)

df['diffs']=np.nan

for idx in t.index.levels[0]:
    df.diffs[idx] = df.weight[idx].diff()

根据您的描述,您可以尝试groupby

df['pet_name']=df.pet + df.name
df.groupby('pet_name')['weight'].diff()

根据您的描述,您可以尝试groupby

df['pet_name']=df.pet + df.name
df.groupby('pet_name')['weight'].diff()

通过两列使用
groupby

df.groupby(['pet', 'name'])['weight'].diff()
总而言之:

#convert dates to datetimes
df['date'] = pd.to_datetime(df['date'])
#sorting
df = df.sort_values(['pet', 'name','date'])
#get differences per groups
df['diffs'] = df.groupby(['pet', 'name', 'date'])['weight'].diff()
样本

np.random.seed(123)

N = 100
L = list('abc')
df = pd.DataFrame({'pet': np.random.choice(L, N),
                   'name': np.random.choice(L, N),
                   'date': pd.Series(pd.date_range('2015-01-01', periods=int(N/10)))
                              .sample(N, replace=True),
                   'weight':np.random.rand(N)})


df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['pet', 'name','date'])
df['diffs'] = df.groupby(['pet', 'name', 'date'])['weight'].diff()

df['pet_name'] = df.pet + df.name
df = df.sort_values(['pet_name','date'])
df['diffs1'] = df.groupby(['pet_name', 'date'])['weight'].diff()


通过两列使用
groupby

df.groupby(['pet', 'name'])['weight'].diff()
总而言之:

#convert dates to datetimes
df['date'] = pd.to_datetime(df['date'])
#sorting
df = df.sort_values(['pet', 'name','date'])
#get differences per groups
df['diffs'] = df.groupby(['pet', 'name', 'date'])['weight'].diff()
样本

np.random.seed(123)

N = 100
L = list('abc')
df = pd.DataFrame({'pet': np.random.choice(L, N),
                   'name': np.random.choice(L, N),
                   'date': pd.Series(pd.date_range('2015-01-01', periods=int(N/10)))
                              .sample(N, replace=True),
                   'weight':np.random.rand(N)})


df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['pet', 'name','date'])
df['diffs'] = df.groupby(['pet', 'name', 'date'])['weight'].diff()

df['pet_name'] = df.pet + df.name
df = df.sort_values(['pet_name','date'])
df['diffs1'] = df.groupby(['pet_name', 'date'])['weight'].diff()


我实际上是在寻找一种方法,可以完全避免创建一个新列(宠物名)。@LenkaLenka然后你可以检查Jez的答案:-)我实际上是在寻找一种方法,可以完全避免创建一个新列(宠物名)。@LenkaLenka然后你可以检查Jez的答案:-)