我有一个MultiIndex Series(3个索引),看起来像这样:Week ID_1 ID_23 26 1182 39.0 4767 42.0 31393 20.0 31690 42.0 32962 3.0....................................我还有一个数据框df,其中包含上述系列中用于索引的所有列(以及更多列),我想在我的数据框df中创建一个新列,其中包含与ID_1和和系列中的ID_2。例如,对于数据帧中具有Week - 2,ID_1 = 26和ID_2 = 1182的行,我要匹配由Week = 3,ID_1 = 26和ID_2 = 1182(3-2)和将其放在新列的该行上。此外,我的系列可能不一定具有数据框所需的值,在这种情况下,我希望仅具有0。现在,我正在尝试通过使用以下方法做到这一点:[multiindex_series.get((x[1].get('week', 2) - 2, x[1].get('ID_1', 0), x[1].get('ID_2', 0))) for x in df.iterrows()]但是,这非常慢,而且内存很饿,我想知道有什么更好的方法可以做到这一点。FWIW,该系列是使用以下工具创建的saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median()如果存在更好的路径来创建我想要的东西,我愿意以不同的方式来做。 最佳答案 将Week增加2:saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median()saved_groupby = saved_groupby.reset_index()saved_groupby['Week'] = saved_groupby['Week'] + 2然后将df与saved_groupby合并:result = pd.merge(df, saved_groupby, on=['Week', 'ID_1', 'ID_2'], how='left')这将使df增加2周前的目标中位数。要在不匹配时使中位数(目标)saved_groupby列为0,请使用fillna将NaN更改为0:result['Median'] = result['Median'].fillna(0)例如,import numpy as npimport pandas as pdnp.random.seed(2016)df = pd.DataFrame(np.random.randint(5, size=(20,5)), columns=['Week', 'ID_1', 'ID_2', 'Target', 'Foo'])saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median()saved_groupby = saved_groupby.reset_index()saved_groupby['Week'] = saved_groupby['Week'] + 2saved_groupby = saved_groupby.rename(columns={'Target':'Median'})result = pd.merge(df, saved_groupby, on=['Week', 'ID_1', 'ID_2'], how='left')result['Median'] = result['Median'].fillna(0)print(result)产量 Week ID_1 ID_2 Target Foo Median0 3 2 3 4 2 0.01 3 3 0 3 4 0.02 4 3 0 1 2 0.03 3 4 1 1 1 0.04 2 4 2 0 3 2.05 1 0 1 4 4 0.06 2 3 4 0 0 0.07 4 0 0 2 3 0.08 3 4 3 2 2 0.09 2 2 4 0 1 0.010 2 0 4 4 2 0.011 1 1 3 0 0 0.012 0 1 0 2 0 0.013 4 0 4 0 3 4.014 1 2 1 3 1 0.015 3 0 1 3 4 2.016 0 4 2 2 4 0.017 1 1 4 4 2 0.018 4 1 0 3 0 0.019 1 0 1 0 0 0.0关于python - 使用Pandas数据框添加MultiIindex系列的滞后特征,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38678246/
10-12 18:32