当前位置: 首页 > 面试题库 >

将一列从一个DataFrame复制到另一个提供NaN值?

解高昂
2023-03-14
问题内容

这个问题已经被问了很多遍了,而且似乎对其他人也NaN有用,但是,当我从不同的DataFrame复制列(df1并且df2长度相同)时,我得到了值。

df1

        date     hour      var1
a   2017-05-01  00:00:00   456585
b   2017-05-01  01:00:00   899875
c   2017-05-01  02:00:00   569566
d   2017-05-01  03:00:00   458756
e   2017-05-01  04:00:00   231458
f   2017-05-01  05:00:00   986545

df2

      MyVar1     MyVar2 
 0  6169.719338 3688.045368
 1  5861.148007 3152.238704
 2  5797.053347 2700.469871
 3  5779.102340 2730.471948
 4  6708.219647 3181.298291
 5  8550.380343 3793.580394

我需要这样 df2

       MyVar1    MyVar2        date        hour
 0  6169.719338 3688.045368  2017-05-01  00:00:00
 1  5861.148007 3152.238704  2017-05-01  01:00:00
 2  5797.053347 2700.469871  2017-05-01  02:00:00
 3  5779.102340 2730.471948  2017-05-01  03:00:00
 4  6708.219647 3181.298291  2017-05-01  04:00:00
 5  8550.380343 3793.580394  2017-05-01  05:00:00

我尝试了以下方法

df2['date'] = df1['date']
df2['hour'] = df1['hour']

type(df1)
>> pandas.core.frame.DataFrame

type(df2)
>> pandas.core.frame.DataFrame

我得到以下内容

       MyVar1    MyVar2      date       hour
 0  6169.719338 3688.045368  NaN        NaN
 1  5861.148007 3152.238704  NaN        NaN
 2  5797.053347 2700.469871  NaN        NaN

问题答案:

您的DataFrames的索引是不同的 (相应地,每列 的索引也不同 ),因此,当尝试将一个DataFrame的列分配给另一列时,
pandas会尝试对齐索引,但这样做会失败,请插入NaN。

考虑以下示例以了解这意味着什么:

# Setup
A = pd.DataFrame(index=['a', 'b', 'c']) 
B = pd.DataFrame(index=['b', 'c', 'd', 'f'])                                  
C = pd.DataFrame(index=[1, 2, 3])



# Example of alignable indexes - A & B (complete or partial overlap of indexes)
A.index B.index
      a        
      b       b   (overlap)
      c       c   (overlap)
              d
              f



# Example of unalignable indexes - A & C (no overlap at all)
A.index C.index
      a        
      b        
      c        
              1
              2
              3

当没有重叠时,熊猫甚至无法匹配两个DataFrame之间的单个值以放入分配结果,因此输出是充满NaN的列。

如果您使用的是IPython笔记本,则可以使用以下命令检查这是否确实是根本原因,

df1.index.equals(df2.index)
# False
df1.index.intersection(df2.index).empty
# True

您可以使用以下任何一种解决方案来解决此问题。

解决方案1:重置两个DataFrames的索引

如果您不打算一开始就拥有不同的索引,或者您不太在意保留索引,则可能更喜欢此选项。

# Optional, if you want a RangeIndex => [0, 1, 2, ...]
# df1.index = pd.RangeIndex(len(df))
# Homogenize the index values,
df2.index = df1.index
# Assign the columns.
df2[['date', 'hour']] = df1[['date', 'hour']]

如果要保留现有索引,但要保留为列,则可以使用reset_index()

解决方案2:分配NumPy数组(绕过索引对齐)

仅当两个DataFrame的长度匹配时,此解决方案才有效。

# pandas >= 0.24
df2['date'] = df1['date'].to_numpy()
# pandas < 0.24
df2['date'] = df1['date'].values

要轻松分配多个列,请使用

df2[['date', 'hour']] = df1[['date', 'hour']].to_numpy()


 类似资料:
  • 问题内容: 上周,我创建了一个Github存储库,却忘记选择该存储库的许可证。现在已经有3个大型提交。 我问了3个贡献者是否还可以,是否删除了回购文件,然后使用相同的名称再次创建它,这一次在创建回购文件时选择了许可证,他们对此有何看法。 题 有没有一种方法可以将提交提交到新的存储库中(这次第一次提交是LICENSE文件),并且仍然保留提交元信息? 问题答案: 有没有一种方法可以将提交提交到新的存储

  • 问题内容: 我在不同的程序包中有几个Pojo,每个POJO包含同一程序包中另一个Pojo的集合。我需要将所有具有相同名称的项目从Package B Pojos复制到Package A中的对象。 极端: 我想递归地将所有项目从类复制到存在且共享相同名称的类。 更新: 伙计们,我知道这是一个愚蠢的问题,但是我需要维护此代码,现在编写代码时,他们必须调用50个getter和setter或使用50个参数调

  • 我目前有一个ArrayList,其中包含“Product”对象,每个对象中包含一个字符串、整数和double。我希望能够使用参数搜索对象,找出与搜索参数匹配的ID(整数值),并将此对象复制到另一个ArrayList中。有没有可能通过迭代器实现这一点,或者有没有更简单的方法?

  • 我主要在RPC模式下使用rabbitMq,但我还想将请求和响应消息复制到另一个队列。 最后,我想实现的是,外部消费者可以通过听一个队列来查看所有流量,我们称之为“日志队列”。 复制传入消息是可以的,我只需要使用扇出交换,或者使用与RPC调用使用的路由密钥相同的路由密钥将日志队列绑定到使用过的交换。 但我无法找到通过直接回复功能“扇出”发送的消息的方法。 到目前为止,我了解到响应消息以amqp的形式

  • 问题内容: 在Pandas DataFrame中,我可以使用函数将列值与另一列进行匹配。 例如:假设我们有一个DataFrame: 和另一个DataFrame: 我可以使用的功能相匹配的列值对的列值 例如: 产量: PySpark DataFrame中的等效操作是什么? 上面的代码给我一条错误消息: 问题答案: 这种操作在spark中称为“左半联接”:

  • 我有一个名为的表和另一个的表。是表的副本。 现在,表可以随时删除并重新创建,添加新列并将旧列重命名为不同的列。我编写了一个存储过程,它将数据从表复制到表,这取决于是否需要插入或更新 现在我有点迷路了:如何解决这个问题,即一旦删除并重新创建了sales表,如何修改对saleshistory表的更改? 任何想法或相同的代码,如果需要,我可以在存储过程中共享我的代码,但这很简单 这是代码