【问题标题】:Assigning column to larger DataFrame in specific positions [closed]在特定位置将列分配给更大的 DataFrame [关闭]
【发布时间】:2021-02-03 19:21:16
【问题描述】:

我有两个列表。

A = [0, 1, 0, 0, 1, 1, 0, 1]
B = [2, 3, 4, 5]

我要创建 C:

C = [NaN, 2, NaN, NaN, 3, 4, NaN, 5] 

基本上,在A 中有一个1 我希望有一个B 的值,其中有一个0,一个NaN。 实际上,A 包含大约 10k 个元素,B 大约 40k,我有很多。我正在使用 pandas.DataFrame(每个“数组”是两个不同数据帧的列,我必须通过将其转换为 C 来“适应”B 中的 A)。 我已经用 for 循环完成了它,但我想知道如何以更好的方式做到这一点。谢谢。

【问题讨论】:

  • 欢迎来到 SO。这不是讨论论坛或教程。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。花点时间阅读用户指南pandas.pydata.org/docs/user_guide/index.html,练习示例。
  • A contains around 10k elements, B around 40k - 在您的示例中,A 的项目多于 B。一/零 array 总是大于还是总是小于 other 数组?
  • 零/一数组中1的个数是否总是等于other数组的长度?
  • A 总是大于B,第二个问题的答案是
  • 假设 A 和 B 是 Numpy ndarray:C = np.full(A.shape,np.nan); C[A==1] = B

标签: python pandas dataframe numpy


【解决方案1】:

您可以使用list comprehension 并检查if 条件是否为0。如果是0,则提供None,否则从左侧弹出B。

[None if i==0 else B.pop(0) for i in A]

输出

[None, 2, None, None, 3, 4, None, 5]

【讨论】:

  • 它是这样工作的:B = list(B_df['x']) A_df['x'] = [np.NaN if i==0 else B.pop(0) for i in A_df['ones_and_zeros']] 但不是这样的:A_df['x'] = [np.NaN if i==0 else list(B_df['x']).pop(0) for i in A_df['ones_and_zeros']] 谢谢!
【解决方案2】:

如果你不一定想保留 Int 类型,你可以用 Numpy 做到这一点:

A = np.array([0, 1, 0, 0, 1, 1, 0, 1], dtype=np.float)
B = np.array([2, 3, 4, 5])

A[A == 1] = B
A[A == 0] = np.nan

因为 NaN 对象只对浮点类型的数组有效。 警告!:仅当 1 的数量等于数组 B 中的元素数量时才有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多