pandas如何在另一列上导出新列的值

时间:2017-10-25 16:23:20

标签: python-3.x pandas dataframe

我有一个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中执行此操作。

2 个答案:

答案 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