【发布时间】:2018-12-08 05:13:57
【问题描述】:
我认为这将是相当简单的,但显然我在这里遗漏了一些东西。
我希望能够利用np.where 和df.groupby('Name').apply() 在df 中创建一个新列(称为'New'),其中列的值是1,如果相应的索引组(对应于原始df 的索引)大于或等于(>=)特定值,否则0。
对于背景,我将df 按'Name' 列分组,并且我有一个dict(),其中包含用于groupby() 中每个名称的相应值。我希望这很清楚,如有必要,我可以提供进一步的澄清。
这是我目前所拥有的,给定示例df:
df = pd.DataFrame([['William', 1, 0, 0, 0, 1],['James', 0, 1, 1, 1, 1],['James', 1, 0, 0, 0, 0],
['James', 1, 0, 1, 1, 0],['William', 0, 1, 1, 0, 1],['William', 0, 0, 0, 0, 0],
['William', 1, 0, 1, 1, 0],['James', 0, 1, 1, 0, 1],['James', 0, 0, 0, 0, 0]],
columns=['Name','x1','x2','x3','x4','Interest'])
Name x1 x2 x3 x4 Interest
0 William 1 0 0 0 1
1 James 0 1 1 1 1
2 James 1 0 0 0 0
3 James 1 0 1 1 0
4 William 0 1 1 0 1
5 William 0 0 0 0 0
6 William 1 0 1 1 0
7 James 0 1 1 0 1
8 James 0 0 0 0 0
然后我在df 中找到'Interest' 列具有1 的每个组的最后一行,使用:
mydict = df[df['Interest']==1].groupby('Name').apply(lambda x: x.index[-1]).to_dict()
{'James': 7, 'William': 4}
注意:这是一个简化的示例。对于我的实际应用程序,我将第三行的索引拉到最后一行(即.apply(lambda x: x.index[-3]).to_dict()),但是下一部分是我问题的根源所在。
现在,我想创建一个新列'Name',如果行索引为>=,则该列的值为1,该组的值为mydict,否则为0。我尝试了一些方法:
for key, val in mydict.items():
df['New'] = np.where((df['Name']==key) & (df.index>=val), 1, 0)
这显然会覆盖为'James' 所做的任何事情,并为'William' 返回正确的列。我怎样才能有效地做到这一点?
为了彻底,这是我的预期输出:
Name x1 x2 x3 x4 Interest New
0 William 1 0 0 0 1 0
1 James 0 1 1 1 1 0
2 James 1 0 0 0 0 0
3 James 1 0 1 1 0 0
4 William 0 1 1 0 1 1
5 William 0 0 0 0 0 1
6 William 1 0 1 1 0 1
7 James 0 1 1 0 1 1
8 James 0 0 0 0 0 1
【问题讨论】:
标签: python pandas numpy pandas-groupby