【问题标题】:pandas how to derived values for a new column base on another column熊猫如何根据另一列导出新列的值
【发布时间】:2018-04-06 20:14:23
【问题描述】:

我有一个dataframe,它有一列,每个值都是一个列表,现在我想派生一个新列,它只考虑大小大于 1 的列表,并将一个唯一整数分配给相应的行作为 id . 一个示例dataframe 就像,

document_no_list    cluster_id
[1,2,3]             1
[4,5,6,7]           2
[8]                 nan
[9,10]              3 

column cluster_id 只考虑第 1、2、4 行,每行的大小都大于 1,并为其在该列中的对应单元格分配一个唯一的整数 id。

我想知道如何在pandas 中做到这一点。

【问题讨论】:

  • 如果你想使用正确的pythonNaNcluster_id的dtype不能是int。这里有一个link 以获得更多说明。

标签: python-3.x pandas dataframe


【解决方案1】:

我们可以将 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 集群 0 [1, 2, 3] 2.0 1 [4, 5, 6, 7] 1.0 2 [8] 南 3 [9, 10] 3.0

如果你想要连续的数字,那么你可以使用

df.loc[x,'Cluster'] =  np.arange(x.sum())+1
document_no_list 集群 0 [1, 2, 3] 1.0 1 [4, 5, 6, 7] 2.0 2 [8] 南 3 [9, 10] 3.0

希望对你有帮助

【讨论】:

  • 很好的答案!可以使用 x.sum() 代替 len(x[x]),可能会更清晰一些。
  • 谢谢@DanielLenz 真的很好
【解决方案2】:

根据条件创建一个布尔列并将 cumsum() 应用于具有 1 的行

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

【讨论】:

  • cumsum 在这种情况下做了什么?
  • cluster_id 列根据条件 True 或 False 包含 1 和 0。现在,如果您过滤此列以仅选择具有 1 的行并将它们累加求和,您将获得从 1 递增 1 的数字 :)
猜你喜欢
  • 2022-11-16
  • 2019-09-29
  • 2018-08-15
  • 2020-12-11
  • 2023-02-05
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多