![](/img/trans.png)
[英]Assign value to pandas DataFrame with hierarchical index based on stacked condition
[英]Pandas assign label based on index value
我有一个带有索引和多列的数据框。 其次,我很少有包含按某些标准采样的索引值的列表。 现在,我想基于事实来创建带有标签的列,无论指定列表中是否存在特定行的索引。
现在有两种情况在使用:
1)要创建一列并基于一个列表给出标签:
df['1_name'] = df.index.map(lambda ix: 'A' if ix in idx_1_model else 'B')
2)要创建一列并基于多个列表给出标签:
def assignLabelsToSplit(ix_, random_m, random_y, model_m, model_y):
if (ix_ in random_m) or (ix_ in model_m):
return 'A'
if (ix_ in random_y) or (ix_ in model_y):
return 'B'
else:
return 'not_assigned'
df['2_name'] = df.index.map(lambda ix: assignLabelsToSplit(ix, idx_2_random_m, idx_2_random_y, idx_2_model_m, idx_2_model_y))
这是可行的,但速度很慢 。 每次通话大约需要3分钟,并且考虑到我必须多次执行功能,因此需要更快。
感谢您的任何建议。
我认为你需要双numpy.where
与Index.isin
:
df['2_name'] = np.where(df.index.isin(random_m + model_m), 'A',
np.where(df.index.isin(random_y + model_y), 'B', 'not_assigned'))
样品:
np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(10,1)), columns=['A'])
#print (df)
random_m = [0,1]
random_y = [2,3]
model_m = [7,4]
model_y = [5,6]
print (type(random_m))
<class 'list'>
print (random_m + model_m)
[0, 1, 7, 4]
print (random_y + model_y)
[2, 3, 5, 6]
df['2_name'] = np.where(df.index.isin(random_m + model_m), 'A',
np.where(df.index.isin(random_y + model_y), 'B', 'not_assigned'))
print (df)
A 2_name
0 8 A
1 8 A
2 3 B
3 7 B
4 7 A
5 0 B
6 4 B
7 2 A
8 5 not_assigned
9 2 not_assigned
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.