我有一个dataframe
,其列中每个值都是一个列表,现在我想派生一个新列,它只考虑大小大于1的列表,并为相应的行分配一个唯一的整数作为身份。
示例dataframe
就像,
document_no_list cluster_id
[1,2,3] 1
[4,5,6,7] 2
[8] nan
[9,10] 3
列cluster_id
仅考虑第1行,第2行和第4行,每行的大小都大于1,并为列中相应的单元格指定唯一的整数id。
我想知道如何在pandas
中执行此操作。
答案 0 :(得分:2)
我们可以使用np.random.choice作为唯一的随机值,其中.loc用于赋值,即
df = pd.DataFrame({'document_no_list' :[[1,2,3],[4,5,6,7],[8],[9,10]]})
x = df['document_no_list'].apply(len) > 1
df.loc[x,'Cluster'] = np.random.choice(range(len(df)),x.sum(),replace=False)
输出:
document_no_list Cluster 0 [1, 2, 3] 2.0 1 [4, 5, 6, 7] 1.0 2 [8] NaN 3 [9, 10] 3.0
如果您想要连续数字,那么您可以使用
df.loc[x,'Cluster'] = np.arange(x.sum())+1
document_no_list Cluster 0 [1, 2, 3] 1.0 1 [4, 5, 6, 7] 2.0 2 [8] NaN 3 [9, 10] 3.0
希望有所帮助
答案 1 :(得分:1)
根据条件创建一个布尔列,并在具有1&#39的行上应用cumsum()
df['cluster_id'] = df['document_no_list'].apply(lambda x: len(x)> 1).astype(int)
df.loc[df['cluster_id'] == 1, 'cluster_id'] = df.loc[df['cluster_id'] == 1, 'cluster_id'].cumsum()
document_no_list cluster_id
0 [1, 2, 3] 1
1 [4, 5, 6, 7] 2
2 [8] 0
3 [9, 10] 3